IDBDatabase.transaction始终为null

时间:2015-12-31 20:17:36

标签: javascript indexeddb

我一直关注页面Using IndexedDB

加载页面后,我创建/加载数据库。

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

在此之后,我为onerror对象定义onupgradeneededonsuccessApp.db

onupgradeneeded中,我创建了一个新的对象库。

最后,Javascript自动调用onsuccess方法,因为创建/加载了数据库。在此方法中,我列出了App.db

的详细信息
App.db.onsuccess = function(ev){
    console.dir( App.db );
};

控制台显示,

readyState = "done" result = IDBDatabase transaction = null

我分别使用file:///,http://localhosthttp://myownserver.that.is.forwarded.to.127.0.0.1.from.domain.provider调用了该页面。

但问题仍然存在。 transaction方法为空,我无法执行任何操作,启动任何事务。有什么问题,我错过了什么?

1 个答案:

答案 0 :(得分:2)

indexedDB.open返回请求对象(IDBRequest)。因此,App.db将保留请求。

听起来你已经掌握了升级过程。

一旦完成,就会通过请求的IDBDatabase属性返回连接对象(result实例),并使用连接对象上的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(...);
};