IDBCursor: update() 方法

Baseline 已广泛支持

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

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

update() 方法是 IDBCursor 接口的一部分,它会返回一个 IDBRequest 对象,并在一个单独的线程中更新对象存储中光标当前位置的值。如果光标指向一个刚刚被删除的记录,那么会创建一个新记录。

请注意,你不能对从 IDBIndex.openKeyCursor() 获取的光标调用 update() (或 IDBCursor.delete())。对于这些需求,你应该改用 IDBIndex.openCursor()

语法

js
update(value)

参数

value

要存储在当前位置的新值。

返回值

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

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

异常

此方法可能会抛出以下类型之一的DOMException

TransactionInactiveError DOMException

如果此 IDBCursor 的事务不活跃,则抛出此错误。

ReadOnlyError DOMException

如果事务模式是只读,则抛出此错误。

InvalidStateError DOMException

如果光标是使用 IDBindex.openKeyCursor 创建的,当前正在迭代,或者已经迭代到末尾之后,则抛出此错误。

DataError DOMException

如果底层对象存储使用内联键,并且对象存储键路径中值中的属性与光标当前位置的键不匹配,则抛出此错误。

DataCloneError DOMException

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

示例

在这个简单的代码片段中,我们创建了一个事务,检索了一个对象存储,然后使用光标迭代对象存储中的所有记录。如果当前光标的 albumTitle 是“A farewell to kings”,我们将使用 const request = cursor.update(); 更新专辑发行的年份。

请注意,你不能使用 cursor.update() 来更改主键,因此我们没有更改专辑标题;这会破坏数据的完整性。在这种情况下,你必须先删除该记录,然后使用 IDBObjectStore.add 添加一个新记录。另请注意,你不能直接将 cursor.value 传递给 update 调用,因此下面的示例使用了一个中间变量 updateData

光标不需要我们根据键来选择数据;我们可以直接获取所有数据。另请注意,在循环的每次迭代中,你可以使用 cursor.value.foo 从光标对象下的当前记录中获取数据。有关完整的可工作示例,请参阅我们的 IDBCursor 示例在线查看示例)。

js
function updateResult() {
  list.textContent = "";
  const transaction = db.transaction(["rushAlbumList"], "readwrite");
  const objectStore = transaction.objectStore("rushAlbumList");

  objectStore.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      if (cursor.value.albumTitle === "A farewell to kings") {
        const updateData = cursor.value;

        updateData.year = 2050;
        const request = cursor.update(updateData);
        request.onsuccess = () => {
          console.log("A better album year?");
        };
      }

      const listItem = document.createElement("li");
      listItem.textContent = `${cursor.value.albumTitle}, ${cursor.value.year}`;
      list.appendChild(listItem);
      cursor.continue();
    } else {
      console.log("Entries displayed.");
    }
  };
}

规范

规范
Indexed Database API 3.0
# ref-for-dom-idbcursor-update①

浏览器兼容性

另见