在IndexedDB的onupgradeneeded()
事件中,我试图更新对象库中的每条记录。为了更新它们,我需要首先执行异步操作,但这会导致升级事务变为非活动状态,并且出现错误
Failed to execute 'update' on 'IDBCursor': The transaction is not active.
在以下代码中,我使用setTimeout()
let openRequest = indexedDB.open('myDb', 1);
openRequest.onupgradeneeded = function (versionEvent) {
let db = versionEvent.target['result'];
let upgradeTransaction = versionEvent.target['transaction'];
if(versionEvent.oldVersion < 1) {
let objStore = db.createObjectStore('sample');
objStore.add('one', '1');
objStore.add('two', '2');
}
if(versionEvent.oldVersion >= 1) {
let getCursor = upgradeTransaction.objectStore('sample').openCursor();
getCursor.onsuccess = (e) => {
let cursor = e.target['result'];
if (cursor) {
setTimeout(() => {
cursor.update(cursor.value + ' updated');
cursor.continue();
})
}
}
}
};
https://plnkr.co/edit/DIIzLduZT1dwOEHAdzSf?p=preview
如果您运行此plunker,它将初始化IndexedDB。然后,如果将版本号增加到2并再次运行,则会出现错误。
如果我的更新依赖于异步操作,如何在升级事件中更新IndexedDB?
答案 0 :(得分:2)
您需要一种不同的方法。选项包括:
后者有两种方法。您可以在没有版本号的情况下执行open()
,检查版本,然后在低于所需值时获取/升级。或者您可以在新版本中打开并在upgradeneeded中中止升级(从请求获取事务并在其上调用abort()
)然后获取数据并重新尝试升级。