修复 indexedDB

Repair an indexedDB

提问人:Craig 提问时间:11/1/2023 更新时间:11/1/2023 访问量:50

问:

有没有办法在不更改版本号的情况下保证 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。

JavaScript 索引数据库

评论

0赞 Chukwujiobi Canon 11/1/2023
有没有办法在不更改版本号的情况下保证 indexedDB 中对象存储的存在?你是说创造吗?保证存在是我无法很好地理解的短语。
0赞 Chukwujiobi Canon 11/1/2023
请注意,您正在使用客户端浏览器。每个人的浏览器都以这样或那样奇怪的方式运行。
0赞 Craig 11/1/2023
@ChukwujiobiCanon 我的意思是,如果 X 不存在,请创建 X,但如果 X 已经存在,请不要尝试创建 X(因为这会失败)。因此,无论系统在我的代码之前处于什么状态,我都可以肯定地知道,在过程结束时,正好有一个名为 X 的 objectStore
0赞 Chukwujiobi Canon 11/1/2023
好吧,现在更有意义了。我记得 API 的一部分返回当前打开的特定数据库ObjectStores 的 DOMStringList。检查 IDBDatabase:objectStoreNames 属性
0赞 Chukwujiobi Canon 11/1/2023
你有没有发现为什么该用户的数据库与其他人的数据库具有相同的版本,但仍然没有 ObjectStore?

答:

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
没有一个数据是珍贵的,所有数据都只是缓存的数据,在使用过程中可以轻松重建。然后我会坚持触发它来擦除所有内容,并知道它又开始了