1

我对 indexeddb 有疑问 - 我正在使用此方法打开和设置数据库

DBService.prototype.open = function (dbName, entity, cb) {
  var self = this;
  var req = indexedDB.open(dbName)
  req.onsuccess = function(e) {
    var v = 1;
    DBService.storage.db = e.target.result;
    var db = DBService.storage.db;
    // We can only create Object stores in a setVersion transaction;
    if (v != db.version) {
      var setVrequest = db.setVersion(v);

      setVrequest.onerror = function (err, stack) {
        console.log(err, stack);
      }

      setVrequest.onsuccess = function(e) {
        if(db.objectStoreNames.contains(entity)) {
          db.deleteObjectStore(entity);
        }

        var store = db.createObjectStore(entity,
          {keyPath: "timeStamp"});
        e.target.transaction.oncomplete = function() {
          console.log(db);
          cb(db);
        };
      };
    } else {
      cb(db);
      /*
      req.transaction.oncomplete = function() {
        cb(db);
      */
    }
  };

  req.onerror = function (err, stack) {
    console.log(err)
    console.log(stack)
  }
};

一切都很好,除非数据库从未打开过。我仍然得到

InvalidStateError: DOM IDBDatabase Exception 11

(当我 console.log req.error 时)

我知道这段代码现在很脏,我正在尝试一切。我保证当它运行良好时,我会重构它!

谢谢!

4

2 回答 2

3

我假设您仅在 chrome 中使用此页面,因为其他浏览器不再支持 setVersion。

你到底是什么意思“除了没有打开数据库的情况外,一切都很好。”?有时 db.open 调用失败并调用 req.onerror ?在任何情况下,您的错误事件处理程序都应该只接受一个参数,只传递一个错误,而不是堆栈。

InvalidStateError: DOM IDBDatabase Exception 11 异常的一个常见原因是在请求对象收到任何事件之前访问 req.error。例如,此代码将抛出异常 11:

var request = indexedDB.open("some db");
console.log(request.error);

然而

var request = indexedDB.open("some db");
request.onerror = request.onsuccess = function(e) { console.log(request.error); };

不会抛出异常。

您可能还想添加setVrequest.onblocked = function(e) { console.log("got blocked:" + e); };只是为了知道被阻止的事件是否会给您带来一些麻烦。

于 2012-09-01T08:57:08.957 回答
1

“InvalidStateError:DOM IDBDatabase Exception 11”的另一个原因是当您尝试在 Chrome 中的 setVersion 操作中执行另一个事务时 - 通常在创建/升级数据库后立即填充数据。

如果您需要在 setVersion 完成后填充数据,那么您必须使用此模式,否则您将收到该异常 - 奇怪的是 Chrome 22 我只有在将扩展程序发布到 chrome 商店后才看到这一点。

确保使用此模式:

https://groups.google.com/a/chromium.org/forum/#!msg/chromium-html5/VlWI87JFKMk/6GWbB_HvxtsJ

db.setVersion('3').onsuccess = function(event) {
var transaction = event.result;
transaction.oncomplete = function() {
  db.transaction('mystore', 'readwrite').onsuccess = populateDataStore;
 };
}
于 2012-11-15T21:37:08.550 回答