我是第一次创建本地IndexedDB,浏览器会根据onupgradeneeded
方法触发window.indexedDB.open
请求。
我想在onupgradeneeded
事件中创建多个表格(例如商店),但我想在交易中执行此操作。
我看到事务对象支持`.objectStore',但这意味着已经创建了商店/表。
如何创建多个商店并将其包装在交易中?
答案 0 :(得分:2)
您可以在onupgradeneeded
事件处理程序中创建多个对象库。它已经在交易中了。实际上,它是数据库上的全局独占事务。
创建所需的对象库及其索引后,可以在数据库连接上创建事务。您只需要在db.transaction
中传递对象库列表。
您可以使用事务onupgradeneeded
,但最好只用于在那里创建对象存储。完成onupgradeneeded
事件后,创建另一个读写事务。
答案 1 :(得分:2)
在onupgradeneeded中创建多个对象存储:
var request = indexedDB.open(...);
request.onupgradeneeded = function(event) {
// side note: this === request === event.target === event.currentTarget
var db = this.result;
// Create 0 or more object stores here using this one instance of IDBDatabase.
db.createObjectStore(...);
db.createObjectStore(...);
...
};
onupgradeneeded事件在IDBRequest对象中创建一个VERSION_CHANGE类型的隐式事务。该事务适用于onupgradeneeded回调中的所有调用。上面的每个createObjectStore调用都隐式使用相同的事务。
如果需要,您可以在此函数中使用this.transaction
获取对此事务的引用。在这里,您将访问打开请求的隐式生成的事务属性,它引用为您创建的IDBTransaction对象(类型设置为VERSION_CHANGE),这与使用显式创建事务明显不同IDBDatabase.prototype.transaction 方法。
答案 2 :(得分:1)
在浏览器的控制台中运行此IndexedDB事务示例
let db;
dbName = "Jokes";
dbVersion = 5;
const request = indexedDB.open(dbName, dbVersion);
request.onupgradeneeded = e => {
db = e.target.result
console.log(db);
const jstore = db.createObjectStore("JokeStore", { keyPath: "title" });
const mstore = db.createObjectStore("MockStore", { keyPath: "title" });
alert("upgrade");
}
request.onsuccess = e => {
db = e.target.result
console.log(db);
alert("success");
}
request.onerror = e => {
alert("error" + e.target.error);
}
const tx = db.transaction("JokeStore", "readwrite");
tx.onerror = e => alert(e.target.error);
const jstoretx = tx.objectStore("JokeStore");
jstoretx.add({ title: "Knock Knock", text: "Who's there? There is a place." });
它将在数据库存储中创建一个条目。