IDBObjectStore: put() 方法

注意: 此功能在 Web Workers 中可用。

put() 方法是 IDBObjectStore 接口的方法,用于更新数据库中的给定记录,如果给定项不存在,则插入新记录。

它返回一个 IDBRequest 对象,并在另一个线程中创建该值的 结构化克隆,并将克隆的值存储在对象存储中。这是在事务模式为 readwrite 时,用于添加新记录或更新对象存储中的现有记录。如果记录成功存储,则在返回的请求对象上触发成功事件,并将 result 设置为存储记录的键,并将 transaction 设置为打开此对象存储的事务。

put 方法是一个更新或插入方法。请参阅 IDBObjectStore.add 方法以了解仅插入方法。

请记住,如果您有要更新的记录的 IDBCursor,最好使用 IDBCursor.update() 来更新它,而不是使用 IDBObjectStore.put()。这样做可以明确地表明将要更新现有记录,而不是插入新记录。

语法

js
put(item)
put(item, key)

参数

item

要更新(或插入)的项。

key 可选

要更新的记录的主键(例如,来自 IDBCursor.primaryKey)。

返回值

一个 IDBRequest 对象,后续与此操作相关的事件将在此对象上触发。

如果操作成功,请求的 result 属性的值是新记录或更新记录的键。

异常

此方法可能会引发以下类型之一的 DOMException

ReadOnlyError DOMException

如果与此操作关联的事务处于只读 模式,则抛出此异常。

TransactionInactiveError DOMException

如果此 IDBObjectStore 的事务处于非活动状态,则抛出此异常。

DataError DOMException

如果以下任一条件适用,则抛出此异常

  • 对象存储使用 内联键 或具有 键生成器,并且提供了 key 参数。
  • 对象存储使用非内联键,并且没有键生成器,并且没有提供 key 参数。
  • 对象存储使用内联键,但没有 key 生成器,并且对象存储的 键路径 无法生成有效键。
  • 提供了 key 参数,但它不包含有效键。
InvalidStateError DOMException

如果 IDBObjectStore 已被删除或移除,则抛出此异常。

DataCloneError DOMException

如果要存储的数据无法通过内部结构化克隆算法克隆,则抛出此异常。

示例

以下示例请求给定记录标题;当该请求成功时,onsuccess 函数从 IDBObjectStore 中获取关联的记录(作为 objectStoreTitleRequest.result 提供),更新记录的一个属性,然后使用 put() 将更新后的记录放回对象存储中进行另一个请求。有关完整的示例,请参阅我们的 待办事项通知 应用程序 (查看示例)。

js
const title = "Walk dog";

// Open up a transaction as usual
const objectStore = db
  .transaction(["toDoList"], "readwrite")
  .objectStore("toDoList");

// Get the to-do list object that has this title as its title
const objectStoreTitleRequest = objectStore.get(title);

objectStoreTitleRequest.onsuccess = () => {
  // Grab the data object returned as the result
  const data = objectStoreTitleRequest.result;

  // Update the notified value in the object to "yes"
  data.notified = "yes";

  // Create another request that inserts the item back into the database
  const updateTitleRequest = objectStore.put(data);

  // Log the transaction that originated this request
  console.log(
    `The transaction that originated this request is ${updateTitleRequest.transaction}`,
  );

  // When this new request succeeds, run the displayData() function again to update the display
  updateTitleRequest.onsuccess = () => {
    displayData();
  };
};

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbobjectstore-put①

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅