我有一个存储大量动态数据的IndexedDB。 (静态数据已由服务工作者缓存)
我的问题是这个数据是动态的,我需要清除IndexedDB并在每次打开应用程序时恢复它。为此,我需要增加版本号,以便触发onupgradeneeded事件。我想不出任何合乎逻辑的方法来做到这一点,甚至在onupgradeneeded事件中使用以下调用我得到一个未定义的答案。
e.target.result.oldversion
我的IndexedDB代码如下,参数为: Key - 要存储在数据库中的JSON对象的名称。 值 - JSON对象本身。
function dbInit(key, value) {
// Open (or create) the database
var open = indexedDB.open("MyDatabase", 1);
console.log(value);
// Create the schema
open.onupgradeneeded = function(e) {
console.log("Old Version: " + e.target.result.oldversion); //Undefined
console.log("New Version: " + e.target.result.newversion); //Undefined
var db = open.result;
var store = db.createObjectStore("Inspections", {keyPath: "id", autoIncrement: true});
var index = store.createIndex(key, key);
};
open.onsuccess = function() {
// Start a new transaction
var db = open.result;
var tx = db.transaction("Inspections", "readwrite");
var store = tx.objectStore("Inspections");
var index = store.index(key);
store.add(value);
// Close the db when the transaction is done
tx.oncomplete = function() {
db.close();
};
}
}
由于对于几个'Key'对象多次调用此方法,我需要找到一种方法,在每次打开页面时增加此版本号,然后将'add'调用移到onupgradeneeded之外方法 - 但目前优先级是确保它运行一次 - 增加版本号,触发onupgradeneeded,删除当前数据,存储新数据。
提前致谢!
答案 0 :(得分:2)
oldVersion
和newVersion
属性(请注意大小写)位于IDBVersionChangeEvent上,而不是IDBDatabase上。换句话说,这个:
console.log("Old Version: " + e.target.result.oldversion); //Undefined
console.log("New Version: " + e.target.result.newversion); //Undefined
应该是:
console.log("Old Version: " + e.oldVersion);
console.log("New Version: " + e.newVersion);
现在说...你正在以某种非典型的方式使用模式版本控制。如果确实想在每次打开页面时都使用新数据库,只需在打开之前删除:
indexedDB.deleteDatabase("MyDatabase");
var open = indexedDB.open("MyDatabase", 1);
// An open/delete requests are always processed in the order they
// are made, so the open will wait for the delete to run.
请注意,如果另一个选项卡持有打开的连接,并且没有响应发出的versionchange
事件以响应删除请求,则会阻止排队的操作(删除和打开)。也许这在你的情况下是一件好事 - 它会阻止两个标签同时参与数据库。
更典型的使用模式是仅在Web应用程序升级且数据库架构不同时更改版本。如果您确实需要跨会话擦除数据,则应在打开时进行,而不是在升级时使用,并在对象库中使用clear()
之类的内容。但是现在我们正在进入你的应用程序的设计,听起来你已经有了很好的处理。