如何在事务中创建IndexedDb存储?

时间:2014-11-18 20:58:22

标签: javascript transactions indexeddb

我是第一次创建本地IndexedDB,浏览器会根据onupgradeneeded方法触发window.indexedDB.open请求。

我想在onupgradeneeded事件中创建多个表格(例如商店),但我想在交易中执行此操作。

我看到事务对象支持`.objectStore',但这意味着已经创建了商店/表。

如何创建多个商店并将其包装在交易中?

3 个答案:

答案 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." });

它将在数据库存储中创建一个条目。