删除所有的indexedDB。

12

我需要删除所有的IndexedDB,目前我有:

const indexedDB = window.indexedDB || window.mozIndexedDB
  || window.webkitIndexedDB || window.msIndexedDB;
if (indexedDB.webkitGetDatabaseNames) {
  const bases = indexedDB.webkitGetDatabaseNames();
  bases.onsuccess = (event) => {
    const data = event.target.result;
    Object.values(data).forEach((db) => {
      indexedDB.deleteDatabase(db);
    });
    resolve();
  };
  bases.onerror = reject;
}

但是webkitGetDatabaseNames()函数未定义。是否可能在不使用此方法的情况下删除所有IndexedDB?

附注:我想在不知道IndexedDB的名称的情况下删除它们,并且我需要从代码(Javascript)中删除。

3个回答

18

使用Chrome浏览器

window.indexedDB.databases().then((r) => {
    for (var i = 0; i < r.length; i++) window.indexedDB.deleteDatabase(r[i].name);
}).then(() => {
    alert('All data cleared.');
});

1
谢谢。这个完美地解决了!请注意,在ServiceWorker中使用indexedDB时,全局作用域应该使用self(而不是window)。实际上,selfServiceWorker之外也可以使用。如果你想要自动重新打开已删除的数据库,在最后的then子句中添加self.indexedDB.open('your_db_name', 0);即可。 - OXiGEN

6

获取名称的函数调用indexedDB.webkitGetDatabaseNames已被弃用。 请参见下面的参考资料:

https://github.com/dfahlander/Dexie.js/issues/532

还有一个意图是弃用:IDBFactory webkitGetDatabaseNames

https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/2fUr-3wFPKI/discussion

您可以使用以下技术来删除数据库:

Technique 1:

据我所知,应该使用indexedDB.deleteDatabase来删除数据库。
var req = indexedDB.deleteDatabase(databaseName);
req.onsuccess = function () {
    console.log("Deleted database successfully");
};
req.onerror = function () {
    console.log("Couldn't delete database");
};
req.onblocked = function () {
    console.log("Couldn't delete database due to the operation being blocked");
};

我可以确认它与PhantomJS 1.9.0和Chrome 26.0.1410.43兼容。

Technique 2

理论上,你需要在Chrome中执行以下步骤才能删除IndexedDB:
  1. 在Chrome中,转到“选项”>“隐私设置”>“所有Cookie和站点数据”,找到创建IndexedDB的域
  2. 点击“X”或单击“Indexed Database”>“删除”

在Windows中,该文件位于此处:

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\IndexedDB

在Mac上,请执行以下操作:

  1. 在Chrome中,转到“设置”(或Chrome菜单下的“首选项”)
  2. 单击“显示高级设置”(页面底部)
  3. 转到“隐私”>“内容设置”>“所有Cookie和站点数据”,找到创建IndexedDB的域
  4. 点击“X”或单击“Indexed Database”>“删除”

在Mac上,该文件夹位于此处:

/Users/[USERNAME]/Library/Application Support/Google/Chrome/Default/IndexedDB/

在Linux上,该文件夹位于:
/home/[USERNAME]/.config/google-chrome/Default/IndexedDB/

2
谢谢您的回答,但我想在不知道 IndexedDB 名称的情况下进行删除,并且我需要从代码中进行删除。 - Felipe Pincheira
1
@FelipePincheira 现在从indexedDB中删除而不知道数据库名称的能力已被移除。您可以尝试在创建它们时跟踪数据库(例如在localStorage中),或重新考虑如何实现您的更大目标。 - Josh
感谢Josh,我的一个选项是添加到localStorage,我看不出太多可能性。 - Felipe Pincheira
1
一些抽象API的库会创建一个专门的Indexed DB数据库,用于跟踪通过该库创建的其他数据库。其他浏览器供应商对实现标准化的数据库枚举机制产生了兴趣 - https://github.com/w3c/IndexedDB/issues/31 - 但这并不能立刻帮助你。 - Joshua Bell
@JoshuaBell 我将 Indexed db 的名称保存在 localstorage 中,但我了解到未来还有其他选项。谢谢你的回答。 - Felipe Pincheira

0
indexedDB.databases().then(dbs => {
    var promises = dbs.map(db => {
        return new Promise((resolve, reject) => {
            var req = indexedDB.deleteDatabase(db.Name);
            req.onsuccess = resolve;
            req.onerror = reject;
            req.onblocked = reject;
        });
    });
    Promise.all(promises).then(console.log).catch(console.error);
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接