我一直在使用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
。因此,這是否意味着對於需要訪問數據庫中數據的每個函數,我需要重新打開它,並將其重新分配給一個變量,以便我可以操縱/讀取數據庫中的數據?
這是什麼樣的我也是這麼想的。但是你是對的,我遇到了javascript的異步性問題,這很好。我想一個更精確的問題是:是否必須**錯誤**多次打開多個連接到數據庫的新功能? – Garfonzo
我打開連接幾天,從來沒有問題。我從來沒有關閉連接,但聽取版本更改事件。在這種情況下,你必須關閉。 –
我發現到目前爲止,每次打開連接都只是不好的做法,但性能並不差。我仔細研究了一下(你可以在C/C++中看到Joshua Bell的谷歌瀏覽器indexedDB實現),並且從我記憶中可以看出,存在連接池和自動連接關閉(當conn沒有打開時)超時後。總之,不「壞」只是不太好。 – Josh