我尝试实现一个IndexedDB接口,允许用户从以前的数据库(DB)版本(oldVersion
处理程序onupgradeneeded
中检测到event.target.oldVersion
)迁移数据到最近的版本(currentVersion
即将开放),意味着我需要:
currentVersion
open-operation oldVersion
)onupgradeneeded
currentVersion
数据库的正常过程)我在打开oldVersion
时遇到问题,因为我无法中止(例外11)currentVersion
升级事件(它也是not cancelable)。
异常11:对不允许的对象或不允许的对象调用操作。
是否可以以某种方式取消或中止currentVersion
的升级事件,以便我打开oldVersion
...?
注意:......如果没有,是否有其他方法可以从我缺少的旧版DB数据库中迁移数据?
答案 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');
}
};
}
};