IDBCursor: update() 方法
注意:此功能在 Web Workers 中可用。
update()
方法是 IDBCursor
接口的方法,它返回一个 IDBRequest
对象,并在另一个线程中更新对象存储中游标当前位置的值。如果游标指向一个刚刚被删除的记录,则会创建一个新记录。
请注意,你不能对通过 IDBIndex.openKeyCursor()
获取的游标调用 update()
(或 IDBCursor.delete()
)。对于这种需求,你必须使用 IDBIndex.openCursor()
代替。
语法
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
放入更新调用中,因此以下示例使用了一个中间变量 updateData
。
游标不需要我们根据键选择数据;我们只需获取所有数据。还要注意,在循环的每次迭代中,你可以使用 cursor.value.foo
从游标对象下的当前记录中获取数据。有关完整的代码示例,请参阅我们的 IDBCursor 示例 (查看示例)。
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① |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。
另请参阅
- 使用 IndexedDB
- 启动事务:
IDBDatabase
- 使用事务:
IDBTransaction
- 设置键范围:
IDBKeyRange
- 检索和更改数据:
IDBObjectStore
- 使用游标:
IDBCursor
- 参考示例:待办事项通知 (查看示例)。