Javascript 如何通过js删除IndexedDB旧版本的数据库?
我像这样使用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
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适配器,并且我个人从未遇到过<代码>窗口。
。我不知道它是如何为您工作的。您是否为它创建了原型或其他东西??