2012-05-04 17 views
0
var db; 
var version = 1; 
var request = indexedDB.open("myDB", version); 
request.onsuccess(function(e) {db = e.target.result;}); 
// db.close(); //??? happens async and has no callback 
var request2 = indexedDB.open("myDB", ++version); 
request.onsuccess = function() { console.log("success"); }; 
request.onerror = function() { console.log("error"); }; // called if db existed when page was loaded 
request.onblocked = function(){console.log("blocked");}; // called on init creation 
request.onupgradeneeded = function(){console.log("onupgradeneeded");}; 

我需要能夠打開數據庫,讀取對象存儲,然後更改數據庫。看起來您只能在每次頁面加載時更改一次數據庫結構。你可以在firefox中打開後改變indexedDB數據庫的結構嗎?

在使用不推薦使用的setVersion方法時,這在Chrome中運行良好。

+0

request.onblocked = function(){db.close(); };在此環境中調用close之後,onupgradeneeded事件被觸發。這應該可以避免某人脫髮。 – anonymous

回答

7

IndexedDB API不易使用。幾件事情:

1)upgradeneeded不會觸發,直到沒有其他打開連接到數據庫。取消註釋db.close()行。但是,在請求收到成功事件之前,db不會是IDBDatabase對象,因此您必須等待。

2)request2對象上沒有事件處理函數。您可能打算在代碼示例的最後4行放置request2而不是request。

3)第一個request.onsuccess指派是錯誤的。

4)如果磁盤上的數據庫的版本高於要傳遞的版本,則會調用錯誤處理程序。

試試這個:

indexedDB = indexedDB || mozIndexedDB; 
var db; 
var request = indexedDB.open("myDB"); 
request.onsuccess = function(e) { 
    db = e.target.result; 
    var version = db.version; 
    db.close(); 
    var request2 = indexedDB.open("myDB", ++version); 
    request2.onsuccess = function() { console.log("success"); }; 
    request2.onerror = function() { console.log("error"); }; 
    request2.onblocked = function() { console.log("blocked"); }; 
    request2.onupgradeneeded = function() { console.log("onupgradeneeded"); }; 
}; 

控制檯將顯示:

onupgradeneeded 
success 

如果不是:

  1. 檢查,沒有其他選項卡有連接打開這個數據庫。
  2. 爲請求的其他三個事件添加處理程序,查看哪一個事件觸發。
+1

嘿男人偉大的答案。你很難100%正確使用它。我終於搞定了。對於任何需要使用idb的人來說,讓我爲你節省很多時間。創建一個設置版本的方法,並嚴重依賴該方法來完成任務。 – anonymous

+0

無論是setVersion還是關閉開放,Chrome 23都無法爲我工作。這讓我變得非常瘋狂。已打開的數據庫的setVersion會導致錯誤。然後關閉然後再增加一個版本將會導致'BLOCKED'錯誤。 – hrdwdmrbl

+0

OH YEAH!關閉然後打開indexedDB在Chrome 26(Chrome Canary)中運行。 – hrdwdmrbl

相關問題