IDBObjectStore: put() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

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

put() 方法是 IDBObjectStore 接口的一个方法,用于更新数据库中指定记录,或者在指定的项不存在时插入一条新记录。

它会返回一个 IDBRequest 对象,并在单独的线程中创建一个结构化克隆(structured clone)的 value,然后将其存储到对象存储中。这用于在事务模式为 readwrite 时添加新记录或更新现有记录。如果记录存储成功,则在返回的请求对象上会触发一个 success 事件,其 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() 方法将更新后的记录放回对象存储。有关完整的可工作示例,请参阅我们的 To-do Notifications 应用(在线查看示例)。

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①

浏览器兼容性

另见