我使用像这样的
创建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;
};
在部署时更改数据库的版本。但是如果查看文件的大小(保存浏览器indexedDB),他们会添加新数据而不是删除旧数据。 需要通过js检查indexedDB是否包含旧版本的数据库,并且只丢弃(通过js!)旧版本(不是所有数据库)。
答案 0 :(得分:3)
一些起始字节:
使用您提到的getIndexedDB()
,您将只获得IDB的持有者,它不会打开数据库进行存储。您需要使用以下代码打开IDB实例:
var request = window.indexedDB.open(DB_NAME, DB_VERSION, {storage: "temporary"});
此外,我个人不建议使用webkitIndexedDB
,mozIndexedDB
之类的IDB前缀,除非您有充分的理由使用前缀。详细了解IDB prefix from Mozilla
请注意使用前缀的实现可能有问题,或者 不完整的,或遵循规范的旧版本。
删除IDB实例
打开数据库后,可以使用IDBFactory.deleteDatabase()
删除数据库,阅读更多here。
但请注意,如果为同一个应用程序打开了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
};
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>');
};
};
答案 1 :(得分:0)
在我的案例解决方案中,在打开新连接进行工作之前检查现有版本是否为实际版本。如果没有实际删除所有数据库,请在打开新连接之前。
Runnable r = new Runnable() {
@Override
public void run() {
long futuretime = System.currentTimeMillis()+10000;
while(System.currentTimeMillis()<futuretime){
synchronized (this){
try {
wait(futuretime - System.currentTimeMillis());
} catch (Exception e) {}
}
}
try {
// code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView time = (TextView)findViewById(R.id.timedisplay);
time.setText("Changed Man!!");
}
});
} catch (final Exception ex) {
Log.i("---","Exception in thread");
}
}
};
Thread thread = new Thread(r);
thread.start();