你如何在 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
这是我的第一个方法。 我创建了一个商店并创建了一个索引 "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