Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过js删除IndexedDB旧版本的数据库?_Javascript_Indexeddb - Fatal编程技术网

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

Javascript 如何通过js删除IndexedDB旧版本的数据库?,javascript,indexeddb,Javascript,Indexeddb,我像这样使用indexedDB的创建 var getIndexedDB = function() { if ( !indexedDB ) { indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.oIndexedDB || window.msIndexedDB || ((window.indexedDB === null && window.s

我像这样使用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;
};
在部署时更改数据库的版本。但若查看文件的大小(保存浏览器索引的地方是DDB),它们会添加新数据,而不会删除旧数据。
js需要检查indexedDB是否有旧版本的数据库,drop(js!)只有旧版本(不是所有数据库)。

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

var request = window.indexedDB.open(DB_NAME, DB_VERSION, {storage: "temporary"});
此外,我个人不建议使用IDB前缀,如
webkitinexeddb
mozIndexedDB
,除非您有真正的理由使用前缀。阅读更多关于

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

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

但请注意,若为同一应用程序打开了两个选项卡,这意味着同一数据库的两个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
};
IDB版本:
我个人不建议每次进行新部署时都更改IDB版本,否则用户浏览器最终会有大量IDB实例

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

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

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

     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>');
        };
    };
var dbDeleteRequest=window.indexedDB.deleteDatabase(“toDoList”);
dbDeleteRequest.onerror=函数(事件){
log(“删除数据库时出错。”,true);
};
dbDeleteRequest.onsuccess=函数(事件){
log(“删除数据库时成功”,true);
//让我们打开数据库
var DBOpenRequest=window.indexedDB.open(“toDoList”,5);
DBOpenRequest.onsuccess=函数(事件){
console.log(“
  • 数据库已初始化。
  • ”); }; DBOpenRequest.onupgradeneeded=函数(事件){ log(“
  • DBOpenRequest.onupgradeneeded
  • ”); }; };
    在我的案例解决方案中,在打开新的工作连接之前,请检查现有版本是否为实际版本。如果不是,请在打开新连接之前删除所有数据库

    function deleteOldIndexedDB(dbName, actualVersion){
         if(!indexedDB){
              return false;
         }
    
        var req = indexedDB.open(dbName);
        req.onsuccess = function(event)
        {
            var version;
            if(event.srcElement != undefined){
                version = event.srcElement.result.version;//chrome
            }else{
                version = event.target.result.version;//firefox
            }
    
            event.target.result.close();
            if(version != actualVersion && version != 1){                
                indexedDB.deleteDatabase(dbName);
            }
        };
    }
    

    getIndexedDB需要支持旧的浏览器版本。在您的解决方案中将删除所有数据库,然后创建一个新的,我只需要删除旧版本的数据库。我们不知道以前的版本是什么。需要这样的东西:``你能详细说明一下你的需求吗,比如现在的版本是什么,它是如何更新的,然后你删除了什么..
    window.indexedDB.getDatabaseNames().onsuccess=function(sender,args){var namesList=sender.target.result;for(namesList中的变量i){var db=window.indexedDB.open(namesList[i]);var versionList=db.getVersionNames();for(versionList中的var n){if(versionList[n]我不明白您希望基于版本号删除数据库的方式和原因。.在IDB中,您无法基于版本号删除数据库。.数据库是基于数据库名称删除的。.检查我提供的IDB deleteDatabase链接,
    indexedDB.deleteDatabase()中没有有效的参数<代码>接受版本号,它只接受2个参数-数据库名称和存储类型。您可能需要考虑删除数据库的其他选项,尝试我提供的一个…i HV实现了IDB和WebSQL适配器,并且我个人从未遇到过<代码>窗口。
    。我不知道它是如何为您工作的。您是否为它创建了原型或其他东西??