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

nun*_*uno 3 javascript upgrade indexeddb

我正在尝试实现一个 IndexedDB 接口,该接口允许用户将数据从以前的数据库(DB)版本(在处理程序oldVersion中检测到)迁移到最新版本(即将打开),这意味着我需要:onupgradeneededevent.target.oldVersioncurrentVersion

  1. 取消或中止currentVersion打开操作
  2. 打开前一个数据库(oldVersion在 中检测到onupgradeneeded
  3. 读取其数据
  4. 关闭数据库
  5. (继续打开DB的正常过程currentVersion

我在打开时遇到问题oldVersion,因为我无法中止(异常 11)currentVersion升级事件(它也是不可取消的)。

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

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

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

Jos*_*ell 5

是否可以以某种方式取消或中止当前版本的升级事件,以便我打开旧版本...?

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'); };
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以从我丢失的旧版本数据库迁移数据?

通常这就是整个目的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');
      }
    };
  }
};
Run Code Online (Sandbox Code Playgroud)