检查并增加 IndexedDB 的版本号。

Check and Increment the Version Number of an IndexedDB.

我有一个存储大量动态数据的 IndexedDB。 (静态数据已经被 Service Worker 缓存)

我的问题是因为这个数据是动态的,我需要清除 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,删除当前数据,存储新数据。

提前致谢!

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 事件,则排队的操作(删除和打开)将被阻止。也许这对您来说是件好事 - 它可以防止两个选项卡同时参与数据库。

一种更典型的使用模式是仅在网络应用程序升级且数据库架构不同时才更改版本。如果您确实需要跨会话擦除数据,您会在打开时执行此操作,而不是在升级时执行,并在对象存储上使用 clear() 之类的东西。但现在我们正在研究您的应用程序的设计,听起来您已经掌握得很好。