2015-12-31 193 views
0

我一直在關注頁面Using IndexedDBIDBDatabase.transaction始終爲空

當頁面加載時,我創建/加載數據庫。

window.App = window.App || {}; 
App.db = window.indexedDB.open("myapp", 1); 

以下這些,我定義onerroronupgradeneededonsuccessApp.db對象。

onupgradeneeded中,我創建了一個新的對象存儲。

最後,由於數據庫被創建/加載,所以onsuccess方法由Javascript自動調用。在這種方法中,我列出了App.db的詳細信息。

App.db.onsuccess = function(ev){ 
    console.dir(App.db); 
}; 

控制檯顯示,

readyState = "done"result = IDBDatabasetransaction = null

我叫頁面文件:///,http://localhosthttp://myownserver.that.is.forwarded.to.127.0.0.1.from.domain.provider分開。

但問題依然存在。 transaction方法爲空,我什麼也做不了,開始任何事務。什麼問題,我錯過了什麼?

回答

2

indexedDB.open返回請求對象(IDBRequest)。所以你的App.db將持有這個請求。

這聽起來像你有一個升級過程的句柄。

完成後,通過請求的result屬性返回連接對象(IDBDatabase實例),並且您使用連接對象上的transaction()方法啓動事務。所以,你想要寫你"success"處理器更像是:

App.db.onsuccess = function(ev){ 
    var connection = App.db.result; 
    var tx = connection.transaction(stores, mode); 
    ... 
}; 

但它是更常見的呼叫連接對象像db,你不需要一旦打開了連接扶住請求,所以你可能想要做的更像是這樣的:

var openRequest = indexedDB.open("myapp", 1); 
openRequest.onupgradeneeded = function(e) { 
    var db = openRequest.result; 
    db.createObjectStore(...); 
    ... 
}; 
openRequest.onsuccess = function(e) { 
    App.db = openRequest.result; 
    var tx = App.db.transaction(...); 
};