2015-12-31 50 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(...); 
};