是否可以中止IndexedDB升级事件?

时间:2017-05-17 13:16:58

标签: javascript upgrade indexeddb

我尝试实现一个IndexedDB接口,允许用户从以前的数据库(DB)版本(oldVersion处理程序onupgradeneeded中检测到event.target.oldVersion)迁移数据到最近的版本(currentVersion即将开放),意味着我需要:

  1. 取消或中止currentVersion open-operation
  2. 打开上一个数据库(oldVersion
  3. 中检测到的onupgradeneeded
  4. 阅读其数据
  5. 关闭数据库
  6. (继续打开currentVersion数据库的正常过程)
  7. 我在打开oldVersion时遇到问题,因为我无法中止(例外11)currentVersion升级事件(它也是not cancelable)。

      

    异常11:对不允许的对象或不允许的对象调用操作。

    是否可以以某种方式取消或中止currentVersion的升级事件,以便我打开oldVersion ...?

    注意:......如果没有,是否有其他方法可以从我缺少的旧版DB数据库中迁移数据?

1 个答案:

答案 0 :(得分:3)

  

是否有可能以某种方式取消或中止currentVersion的升级事件,以便我打开oldVersion ......?

var rq = indexedDB.open(name, ver);
rq.onupgradeneeded = function(e) {
  rq.transaction.abort();
};
rq.onsuccess = function(e) { console.log('THIS SHOULD NOT RUN'); };
rq.onerror = function(e) { console.log('This should run'); };
  

还有其他方法可以从我缺少的旧版DB中迁移数据吗?

通常这是upgradeneeded的全部目的 - 在提供给您的verionchange交易期间,您从旧版本迁移数据和架构。

var rq = indexedDB.open(name, 2);
rq.onupgradeneeded = function(e) {
  var db = rq.result;
  if (e.oldVersion < 1) {
    // database didn't exist at all, create new schema
    db.createObjectStore('store2');
  } else if (e.oldVersion < 2) {
    // do the migration - assumes v1 had 'store1'
    var store1 = rq.transaction.objectStore('store1');
    var store2 = db.createObjectStore('store2');
    var r = store1.openCursor();
    r.onsuccess = function() {
      var cursor = r.result;
      if (cursor) {
        store2.put(cursor.value, cursor.key);
        cursor.continue();
      } else {
        // migration done, delete old store
        db.deleteObjectStore('store1');
      }
    };
  }
};