如何通过js删除IndexedDB旧版本数据库?

mol*_*det 2 javascript indexeddb

我像这样使用 indexedDB 的创建

  var getIndexedDB = function() {
  if ( !indexedDB ) {
    indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.oIndexedDB || window.msIndexedDB || ((window.indexedDB === null && window.shimIndexedDB) ? window.shimIndexedDB : undefined);

    if ( !indexedDB ) {
      throw 'IndexedDB required';
    }
  }
  return indexedDB;
};
Run Code Online (Sandbox Code Playgroud)

在部署时更改数据库的版本。但是,如果查看文件的大小(保存浏览器 indexedDB 的位置),他们会添加新数据而不是删除旧数据。js 需要检查 indexedDB 是否有旧版本的数据库,并且只删除(通过 js!)旧版本(不是所有数据库)。

hag*_*wal 5

一些起始字节:
使用getIndexedDB()你提到的,你只会得到IDB的持有者,它不会打开数据库进行存储。您需要使用以下代码来打开 IDB 实例:

var request = window.indexedDB.open(DB_NAME, DB_VERSION, {storage: "temporary"});
Run Code Online (Sandbox Code Playgroud)

另外,我个人不建议使用 IDB 前缀,例如webkitIndexedDB, mozIndexedDB, 除非您有使用前缀的真正充分理由。从 Mozilla阅读有关IDB 前缀的更多信息

请注意,使用前缀的实现可能有问题,或不完整,或遵循旧版本的规范。

删除 IDB 实例:
打开数据库后,您可以使用 删除数据库IDBFactory.deleteDatabase()在此处阅读更多信息

但是请注意,如果为同一个应用程序打开了 2 个选项卡,这意味着同一个数据库的 2 个 IDB 实例,那么您不能删除数据库,因为 db 实例将进入阻塞状态。您可以尝试使用deleteDatabase(),直到您关闭其他选项卡,您将看到数据库删除操作将不起作用。尝试使用下面的代码,你会数据库进入阻塞状态,下面是如何使用 JS 代码删除 IDB 数据库。

var DBDeleteRequest = window.indexedDB.deleteDatabase("toDoList");
DBDeleteRequest.onblocked = function(event) {
    alert("Error message: Database in blocked state. ");
};
DBDeleteRequest.onerror = function(event) {
  console.log("Error deleting database.");
};

DBDeleteRequest.onsuccess = function(event) {
  console.log("Database deleted successfully");

  console.log(request.result); // should be null
};
Run Code Online (Sandbox Code Playgroud)

IDB 版本:
我个人不建议在每次进行新部署时更改 IDB 版本,否则用户浏览器最终会拥有大量 IDB 实例。

IDB 中的版本主要是为了支持 IDB 模式的运行时操作。假设您想添加一些新的列/存储,从现有存储中删除一些索引等,那么您应该将版本增加一并进行数据库模式操作。

清除浏览器缓存和IDBFactory.deleteDatabase()删除 IDB 实例的 2 种机制。

下面是您如何处理打开和删除 IDB,但我们知道您应该/可以localStorage与它结合使用来检查何时只需要打开数据库以及何时删除 + 打开。

     var dbDeleteRequest = window.indexedDB.deleteDatabase("toDoList");
    dbDeleteRequest.onerror = function(event) {
        console.log("Error while deleting database.", true);
    };

    dbDeleteRequest.onsuccess = function(event) {
        console.log("Success while deleting database.", true);
        // Let us open our database
        var DBOpenRequest = window.indexedDB.open("toDoList", 5);

        DBOpenRequest.onsuccess = function(event) {
          console.log('<li>Database initialised.</li>');
        };

        DBOpenRequest.onupgradeneeded = function(event) {
          console.log('<li>DBOpenRequest.onupgradeneeded</li>');
        };
    };
Run Code Online (Sandbox Code Playgroud)