Indexeddb IDBDatabase在新创建db时的异常11

时间:2012-08-31 23:30:23

标签: javascript indexeddb

我有indexeddb的问题 - 我正在使用此方法打开并设置db

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)
  }
};

除了没有打开db的情况外,一切都很好用。我还在

InvalidStateError: DOM IDBDatabase Exception 11

(当我在console.log req.error时)

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

InvalidStateError的一个常见原因:您获得的DOM IDBDatabase异常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); };,以便了解被阻止的事件是否会给您带来麻烦。

答案 1 :(得分: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;
 };
}