你如何在 indexeddb 中创建第二个商店?

How do you create a second store in indexeddb?

这是我的第一个方法。 我创建了一个商店并创建了一个索引 "groupname" 值是具有多个键和值的整个对象。这行得通,但是当我尝试添加另一家商店时,商店出现了,索引也出现了,但值为空...

有人对我如何创建第二个 storeobject 有任何提示吗?

var dbName = "DSD DB";
var request = window.indexedDB.open(dbName, 2);
var db;

request.onerror = function(event) {
    console.log(event.target.errorCode);
};

request.onsuccess = function(event) {
    db = event.target.result;
    console.log(db);
};

// This event is only implemented in recent browsers   
request.onupgradeneeded = function(event) {
    // Save the IDBDatabase interface 
    var db = event.target.result;

    // Create an objectStore for this database
    var objectStore = db.createObjectStore("groups", { keyPath: "groupname" });

    objectStore.transaction.oncomplete = function(event) {
        // Store values in the newly created objectStore.
        var groupObjectStore = db.transaction("groups", "readwrite").objectStore("groups");
        jsonReceivingOneGroup.groups.forEach(function(group) {
            groupObjectStore.add(group);
        });
        console.log(groupObjectStore);
    };
};

提前致谢!

// This event is only implemented in recent browsers   
request.onupgradeneeded = function(event) {
    // Save the IDBDatabase interface 
    var db = event.target.result;

    // Create an objectStore for this database
    var objectStore = db.createObjectStore("groups", { keyPath: "groupname" });

    // Create a second object store
    var aSecondObjectStore = db.createObjectStore("foo");

    var aThirdObjectStore = db.createObjectStore("bar");

    var aFourthObjectStore = db.createObjectStore("baz");

    // etc...
};

如果要修改现有数据库并向其添加商店,则需要打开与版本号比以前更高的数据库的连接。 onupgradeneeded 仅在 (a) 首次创建数据库或 (b) 使用更高版本号打开数据库时调用。

首先,修改您的 onupgradeneeded 函数以创建额外的对象存储。接下来,打开具有更高版本号的数据库。要打开更高版本号的数据库:

var openRequest = indexedDB.open(dbName, 3);

我在这里使用 3 只是因为你的示例显示 2,而 3 比 2 高。

然后,当你走到这一步时,你会得到一个错误。当您使用版本 3 打开并运行 onupgradeneeded 函数时,它将尝试再次创建 groups 对象存储。但是那家店已经存在了。所以现在你需要引入一些逻辑来检查它。有几种方法可以做到这一点。一种简单的方法是检查商店是否已经存在,只有在商店不存在时才创建商店。要检查数据库中是否已存在对象存储,可以使用 db.objectStoreNames.contains

// This event is only implemented in recent browsers   
request.onupgradeneeded = function(event) {
    // Save the IDBDatabase interface 
    var db = event.target.result;

    // Get the list of existing stores, if any
    var stores = db.objectStoreNames;

    // Check whether the store exists before creating it
    if (!stores.contains("groups")) {
      // Create an objectStore for this database
      var objectStore = db.createObjectStore("groups", { keyPath: "groupname" });
    }
};

我能够使用来自 ajax 调用的类似数据创建另一个 table:

var transaction = db.transaction(["pallets"], "readwrite");
var objectStore = transaction.objectStore("pallets");

$.each(masterJson.pallets, function(i, pallet) {
    var request = objectStore.put(pallet);
})

request.onsuccess = function(event) {
    console.log(event.target.response);
};

这个 link 真的很有帮助:https://dzone.com/articles/complete-sample-app-indexeddb