提问人:Craig 提问时间:11/1/2023 更新时间:11/1/2023 访问量:50
修复 indexedDB
Repair an indexedDB
问:
有没有办法在不更改版本号的情况下保证 indexedDB 中对象存储的存在?
上下文:
我的一个用户将 indexedDB 设置为与其他所有人相同的版本,但没有对象存储。我不知道他们是怎么做到的,所以我无法预测它是否会再次发生,也不知道这个问题在公共领域会有多普遍。
我尝试使用以下代码来重建丢失的 objectStore
this.request = window.indexedDB.open(this.dbName, this.DB_VERSION);
this.request.onsuccess = (event) => {
const database = event.target.result;
if (!database.objectStoreNames.contains(store)) {
const newStore = database.createObjectStore(store, {keyPath: 'key'});
newStore.createIndex('expiry_idx', 'exp');
}
}
但是浏览器说我无法运行 createObjectStore,除非我在 onupgradeneeded 事件中。此时,数据库尚未升级。此用户和其他所有用户都使用版本 5。我可以更改代码以尝试打开 v6 并强制升级以修复它,但据我所知,其他人可能会损坏 v6。
答:
1赞
Chukwujiobi Canon
11/1/2023
#1
既然你澄清了这一点
...在不更改版本号的情况下保证 indexedDB 中存在对象存储?
这里的意思是
创造。。。如果它不存在
我想答案是 不
是的,您可以使用 IDBDatabase: objectStoreNames 属性检查它是否存在。它返回一个 DOMStringList,您可以使用它调用该方法。但是,如果不进行版本升级,则无法创建对象存储(如果尚不存在)。contains()
此方法只能在 versionchange 事务中调用。
IDBDatabase:createObjectStore() 方法
2赞
dumbmatter
11/1/2023
#2
如果数据库足够小,有一种非常笨拙的方法可以做到这一点。将所有数据读入内存,删除旧数据库,创建具有正确对象存储和正确版本的新数据库,然后将所有数据写入其中。
评论
0赞
Chukwujiobi Canon
11/1/2023
由于您面向多个客户端,因此这是将每个客户端数据库重置为相同版本(首选的新版本)的好方法。我的👍一个赞成票
0赞
Craig
11/2/2023
没有一个数据是珍贵的,所有数据都只是缓存的数据,在使用过程中可以轻松重建。然后我会坚持触发它来擦除所有内容,并知道它又开始了
评论