有没有办法保证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。
既然你澄清了
保证索引数据库中对象存储的存在
这里的意思是
创建...如果不存在
我想答案是
是的,您可以使用 IDBDatabase: objectStoreNames 属性检查它是否存在。它返回一个 DOMStringList,您可以使用它调用
contains()
方法。但是如果不升级版本,您无法创建对象存储(如果它尚不存在)。
此方法只能在版本更改事务中调用。
IDBDatabase:createObjectStore() 方法