IDBDatabase.transaction 始终为空

IDBDatabase.transaction is always null

我一直在关注页面 Using IndexedDB

加载页面时,我 create/load 数据库。

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

在这些之后,我为 App.db 对象定义了 onerroronupgradeneededonsuccess

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

最后,onsuccess方法被Javascript自动调用,因为数据库是created/loaded。在这个方法中,我列出了 App.db.

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

控制台显示,

readyState = "done" result = IDBDatabase transaction = null

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

但问题依然存在。 transaction方法为null,我什么也做不了,开始任何事务。有什么问题,我错过了什么?

indexedDB.open returns 请求对象 (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(...);
};