如何将新的Objectstore添加到现有的indexeddb

时间:2016-08-09 13:21:28

标签: javascript indexeddb

有人可以告诉我如何将新的objectstore添加到现有的indexeddb实例中,该实例中包含版本号。当我尝试创建新版本时,现有的对象存储库将被删除。

我有一个版本' 1',它有大约10个带数据的对象存储。当我尝试使用新版本号打开相同的数据库时,我丢失了当前的数据和对象存储。

这是我尝试过的。

var _upRequest = indexedDB.open("employees");

    _upRequest.onsuccess = function (e) {
        var thisDb = e.target.result;
        var version = parseInt(thisDb.version)+1;
        thisDb.close();
        var openRequest = indexedDB.open("employees", version);

        //handle setup, this will be run by Firefox
        openRequest.onupgradeneeded = function (e) {
            console.log("running onupgradeneeded");
            var thisDb = e.target.result;

            //Create Employee
            if (!thisDb.objectStoreNames.contains("employee")) {
                console.log("I need to make the employee objectstore");
                var objectStore = thisDb.createObjectStore("employee", { keyPath: "id", autoIncrement: true });
                objectStore.createIndex("searchkey", "searchkey", { unique: false });
            }
            thisDb.close();
        }

        openRequest.onsuccess = function (e) {

            db = e.target.result;

            db.onerror = function (e) {
                alert("Sorry, an unforseen error was thrown.");
                console.log("***ERROR***");
                console.dir(e.target);
            }

            db.close();
        }
    }

2 个答案:

答案 0 :(得分:3)

我没有直接的回答,但是我目前编写的代码对我来说似乎很奇怪。

我首先尝试的一件事是正确绑定onupgradeneeded,onerror,而不是过早关闭数据库。

不要这样做:

var request = indexedDB.open();
request.onsuccess = function() {
  request.onupgradeneeded = function() {};
};

请改为:

var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};

同样,立即绑定onerror,不仅仅是在onupgradeneeded或onsuccess之后,如下所示:

var request = indexedDB.open();
request.onsuccess = function() {};
request.onupgradeneeded = function() {};
request.onerror = function() {};

当indexedDB.open检测到更高版本或第一个版本时,它将调度一个需要升级的事件,等待隐藏的“versionchange”事务完成,然后调度成功事件。

我无法理解你的代码。我不确定你为什么打开连接,关闭它,然后打开第二个连接,然后后期绑定upgradeneeded处理程序。

这是添加对象库然后访问它所需要做的全部内容:

var request = indexedDB.open('name', aNumberGreaterThanTheCurrentVersion);
request.onupgradeneeded = function(event) {
  console.log('Performing upgrade');
  var db = event.target.result;
  console.log('Creating object store');
  db.createObjectStore('mystore');
};

request.onsuccess = function(event) {
  console.log('Connected to database');
  var db = event.target.result;
  var tx = db.transaction('mystore');
  var store = tx.objectStore('mystore');
  console.log('Doing something with store "mystore"');
  // ...
  console.log('Finished doing something, now closing');
  db.close();
};

request.onerror = console.error;

另一个说明。 indexedDB产生不同类型的错误,区分它们很重要。 request.onerror不会像你的日志消息所暗示的那样“抛出”异常。相反,发生的事情是indexedDB调度了一个错误事件。调度错误事件抛出。现在,除此之外,indexedDB的几个函数可以抛出异常。这些需要通过try / catch块捕获。您甚至不会看到已分派的错误事件。您将收到一个实际的脚本错误,该错误会暂停执行,并会自动显示在控制台中,并提供略微提供信息。

答案 1 :(得分:0)

let OpenReq = indexedDB.open( 'dbName', version );
OpenReq.onupgradeneeded = function( e )
{
    let db = e.target.result;
    db.objectStoreNames.contains( "myStore" ) || db.createObjectStore( "myStore" );
}

如果你有一个版本1的存在数据库,那么在版本= 2的代码上面运行将仍然是现有商店。