2014-01-28 82 views
4

我一直在使用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..."); 
      } 
     } 
     } 
    }); 
    } 

saveCredsinitDB功能是$(document).ready()函數內部和db變量聲明initDBsaveCreds功能,但$(document).ready()所以我認爲我的範圍是好的。

問題是,db變量未定義。我收到錯誤:Cannot call method "transaction" of undefined。因此,這是否意味着對於需要訪問數據庫中數據的每個函數,我需要重新打開它,並將其重新分配給一個變量,以便我可以操縱/讀取數據庫中的數據?

回答

2

我的答案必須是:有時。不,你不需要經常打開一個新的連接。您可以在連接上使用多個事務。一個簡單的方法是將db變量傳遞給這些函數。但是,您必須瞭解javascript以及indexedDB的異步特性。有時您需要打開新的連接。例如,引發其他事件。

所以,如果你是做多的交易,使用了大量的功能類似如下:

function domultiplethings() { 
    var db = ... 
    callfunction1(db); 
    callfunction2(db); 
} 

function callfunction1(db) { 
    if(!db) { 
    // open a new connection then call ourself 
    } else { 
    // active connection, do read/write stuff 
    } 
} 
+0

這是什麼樣的我也是這麼想的。但是你是對的,我遇到了javascript的異步性問題,這很好。我想一個更精確的問題是:是否必須**錯誤**多次打開多個連接到數據庫的新功能? – Garfonzo

+0

我打開連接幾天,從來沒有問題。我從來沒有關閉連接,但聽取版本更改事件。在這種情況下,你必須關閉。 –

+0

我發現到目前爲止,每次打開連接都只是不好的做法,但性能並不差。我仔細研究了一下(你可以在C/C++中看到Joshua Bell的谷歌瀏覽器indexedDB實現),並且從我記憶中可以看出,存在連接池和自動連接關閉(當conn沒有打開時)超時後。總之,不「壞」只是不太好。 – Josh