检查并增加IndexedDB的版本号。

时间:2017-10-03 09:33:08

标签: javascript json indexeddb

我有一个存储大量动态数据的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,删除当前数据,存储新数据。

提前致谢!

1 个答案:

答案 0 :(得分:2)

oldVersionnewVersion属性(请注意大小写)位于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()之类的内容。但是现在我们正在进入你的应用程序的设计,听起来你已经有了很好的处理。