저는 조금 전에 IndexedDB를 사용해 왔습니다. 새 데이터베이스를 성공적으로 생성하고 저장소를 만들고 "업그레이드 필요"중에 값을 추가 할 수 있습니다. 내가 이해하지 못하는 것은 데이터베이스가 "열린 상태"로 남아 있습니까? 아니면 데이터베이스의 정보를 읽고 쓸 수있는 액세스가 필요한 모든 기능을 다시 열어야합니까?indexedDB에서 여러 데이터베이스 연결을 여는 것이 좋지 않습니까?
예를 들어, 여기에 새 데이터베이스를 만들고, 하나 개의 레코드를 삽입 (작동) 내 코드입니다 :
나를 혼란입니다 원인을$(document).ready(function() {
var db;
function initDB() {
console.log("opening db...");
var req = indexedDB.open(dbName, version);
req.onsuccess = function(event) {
db = this.result;
console.log("opening db is done");
}
req.onerror = function(event) {
console.log("error opening db: ", event.target.errorCode);
}
req.onupgradeneeded = function(event) {
db = event.target.result;
var store = db.createObjectStore("creds", { autoincrement: true });
store.add({ username:'none', password:'none'}, 1);
}
}
, 내가 그 데이터베이스의 레코드에 액세스해야하는 경우, 또는 레코드를 추가하거나 레코드를 삭제하면 새로운 함수를 만들고 일부 값을 삽입 할 수 있다고 생각했습니다. 이것은 내가 (실패한)가 무엇 :
function saveCreds() {
usr = $("#username").val();
psw = $("#password").val();
$.getJSON(baseURL + "cred-check/?callback=?", { username:usr, password:psw }, function(data) {
if (data.creds_good == 'true'); {
// NEXT LINE FAILS
var store = db.transaction(['creds'], 'readwrite').objectStore('creds');
var request = store.get(1);
request.onsuccess = function (event) {
var data = request.result;
data.username = usr;
data.password = psw;
var requestUpdate = store.put(data, 1);
requestUpdate.onerror = function(event) {
console.log("error putting value...");
}
}
}
});
}
이 saveCreds
과 initDB
기능은 $(document).ready()
함수 내이며 db
변수는initDB
및 saveCreds
기능 외부 을 선언하지만, 그래서 내부의 $(document).ready()
내 범위는 괜찮다고 생각합니다.
문제는 db
변수가 정의되지 않았기 때문입니다. 오류 : Cannot call method "transaction" of undefined
가 표시됩니다.
데이터베이스의 데이터에 액세스해야하는 모든 함수에 대해 데이터베이스를 다시 조작하여 변수를 재 할당해야 데이터베이스에서 데이터를 조작/읽을 수 있습니다.
이 내가 무슨 생각의 종류 : 여러 트랜잭션을 수행하는 경우
그래서, 다음과 같은 많은 기능 무언가를 사용합니다. 하지만 당신 말이 맞아요, 자바 스크립트의 비동기 성질에 관한 문제에 봉착하고 있습니다. 괜찮습니다. 더 정확한 질문은 짐작할 수 있습니다. ** 여러 기능으로 여러 번 데이터베이스에 새로운 연결을 열어야한다는 것은 반드시 ** 나쁜 것입니까? – Garfonzo
며칠 동안 연결을 열었습니다. 결코 문제가 없었습니다. 절대로 연결을 닫지 않고 버전 변경 이벤트를 수신합니다. 이 경우 반드시 닫아야합니다. –
나는 지금까지 연결을 열 때마다 나쁜 습관 만 있지만 성능은 좋지 않다는 것을 발견했다. 나는 당신이 Joshua Bell의 Google 크롬 indexedDB 구현을 C/C++에서 볼 수 있음을 보았으며, 내가 기억하는 바로는 연결 풀링과 자동 연결 닫기가있다 (conn가 열리지 않을 때) 시간 초과 후. 간단히 말해서, "나쁘지 않은"것은별로 좋지 않습니다. – Josh