具有更高版本的opendatabase时的DOMException

时间:2014-03-24 08:43:01

标签: indexeddb

我想创建多个数据存储区,所以我找到了解决方案,我可以在版本更改时执行此操作。

所以我写了以下

var request = indexedDB.open(dbName);
    request.onsuccess = function (e){
        var db = e.target.result;
        var version = db.version;
        db.close();

        var request2 = indexedDB.open(dbName , ++version);
        console.log(request2);   //Error on this line

        request2.onsuccess = function() { console.log("success .. "); };
        request2.onerror = function() { console.log("error..."); };
        request2.onblocked = function() { console.log("blocked..."); };
        request2.onupgradeneeded = function(e2) { 
            //Will creaate new datastore here
        };
    }

当我使用更高版本打开数据库时,它会发出以下错误" 错误:[例外:DOMException] "

DBOpenDBRequest {onupgradeneeded: null, onblocked: null, onerror: null, onsuccess: null, readyState: "pending"…}
  error: [Exception: DOMException]
  onblocked: function () { console.log("blocked..."); }
  onerror: function () { console.log("error..."); }
  onsuccess: function () { console.log("success .. "); }
  onupgradeneeded: function (e2) {
  readyState: "pending"
  result: [Exception: DOMException]
  source: null
  transaction: null
 __proto__: IDBOpenDBRequest

enter image description here

提前致谢。

4 个答案:

答案 0 :(得分:2)

我认为版本属性可能是个问题。你确定它有价值吗?当版本的值为0或负数时打开数据库时会发生DOM异常。有关详细信息,请参阅the specs

当您尝试使用更高版本再次打开数据库时,会出现阻止事件。

尝试将以下内容添加到db对象中。

db.onversionchange = function (event) { event.target.close(); }

这将关闭当前连接。因此db的升级可以继续。升级数据库时,您无法建立任何打开的连接。

答案 1 :(得分:2)

你的IDB没事。看起来您的第二个success回调中存在范围问题。我发现request2对象未定义但请求本身没问题。

Here's a working fiddle剥离了核心问题(第二个IDBOpenRequest) - 执行此操作时,您会看到每次运行时的版本增量。

var dbName = 'User780611',
  request = indexedDB.open(dbName);

request.onsuccess = function (e) {
  var db = e.target.result;
  var version = db.version;
  db.close();
  var request2 = indexedDB.open(dbName, ++
    version);
  request2.onsuccess = function () {
    window.document.getElementById('User780611').innerHTML = this.result.version;
  };
}

答案 2 :(得分:0)

我的猜测是请求2的打印输出错误,因为它仍然忙于打开数据库或调用upgradeneeded。我认为 - 如果删除console.log(request2); - 尝试捕捉代码 - 将console.log放入所有回调中,您将看到正在发生的事情。

var request = indexedDB.open(dbName);
request.onsuccess = function (e){
    var db = e.target.result;
    var version = db.version;
    db.onversionchange = function () { console.log("version change ...."); };
    db.close();

    try
    {
       var request2 = indexedDB.open(dbName , ++version);
       //console.log(request2);   //Error on this line

       request2.onsuccess = function() { console.log("success .. "); };
       request2.onerror = function() { console.log("error..."); };
       request2.onblocked = function() { console.log("blocked..."); };
       request2.onupgradeneeded = function(e2) { 
           //Will creaate new datastore here
           console.log("upgradeneeded...");
       };
    }
    catch(ex)
    {
        console.log(ex);
    }
}

答案 3 :(得分:0)

我刚遇到同样的问题。正如克里斯托夫所说,“封锁”信息意味着存在开放的联系。因此,尽管第一个request.onsuccess回调中的db.close()仍然出现它仍然出现的原因意味着还有另一个数据库仍然打开。因此,您需要在执行第二个请求之前关闭它。

以下是我为了添加对象存储而解决的问题:

var idb = (function(){

  var idbObj = {};
  var db = null;   //gonna need to close this db later when adding new object store
  const dbName = "collectionDB3";
  var version = 1;

idbObj.open = function(){

      var objectStore;
      var dbRequest = window.indexedDB.open(dbName);

      dbRequest.onupgradeneeded = function(event){
        var thisDB = event.target.result;

        if(!thisDB.objectStoreNames.contains("collection")) {
            objectStore = thisDB.createObjectStore("collection", { keyPath: 'id',   autoIncrement: true });  
        }
        console.log("upgrading", thisDB);
      };


      dbRequest.onsuccess = function(event){

        db = event.target.result;
        version = db.version;

        console.log("opened database", version);
      };

      dbRequest.onerror = function(event){
        console.log("database error ", event.target.errorCode);
      };
  };


 idbObj.addObjectStore = function(storeName){
      db.close();    //this is where the only opened db connection is closed
      var request = indexedDB.open(dbName, version+1);  //increment version to create object store in onupgradeneeded

        request.onupgradeneeded = function (event) {
          var thisDB = event.target.result;

          if(!thisDB.objectStoreNames.contains(storeName)) {
            var objectStore = thisDB.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });   
          }
        };

        request.onsuccess = function (event) {
          db = event.target.result; //update db
          version = db.version;  //update db's version
          console.log("added objectstore", db);
        };

        request.onerror = function(event){
            console.log("database error ", request.error);
        };

   };

    return idbObj;
}());


idb.open();   
createObjectStore();   //test the addObjectStore method see if new object store is created

function createObjectStore(){
  setTimeout(function(){idb.addObjectStore("newStoreName")}, 3000);
}

希望这有助于=)