为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用自动增量键更新 IndexedDB 项?

如何使用自动增量键更新 IndexedDB 项?

慕桂英3389331 2023-06-29 21:00:39
我使用 autoIncrement 创建了一个对象存储:db.createObjectStore("items", {autoIncrement:true});现在我希望能够根据给定的键和新值更新项目,因此我编写了以下函数:let updateItem = (key, newData) => {    let objectStore = db.transaction(["items"], "readwrite").objectStore("items");    let request = objectStore.get(key);    request.onsuccess = (e) => {        let data = e.target.result;        Object.assign(data, newData);        let requestUpdate = objectStore.put(data);          };}但是,它不会更新值,而是使用新数据创建一个新项目。我认为这是有道理的,因为e.target.result不包含有关其密钥的任何信息。那么如何更新这样的对象存储中的元素呢?
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您需要添加一个键作为第二个参数,例如objectStore.put(data, key)

钥匙

您要更新的记录的主键(例如来自IDBCursor.primaryKey)。仅当对象存储具有主键时才需要这样做autoIncrement,因此该键不在记录对象的字段中。在这种情况下,调用put(item)总是会插入一条新记录,因为它不知道您可能想要修改哪些现有记录。

-- IDBObjectStore.put() - Web API | | -- IDBObjectStore.put() - Web API | MDN


查看完整回答
反对 回复 2023-06-29
?
狐的传说

TA贡献1804条经验 获得超3个赞

我找到了另一个解决方案cursor.update():


let updateItem = (key, newData) => {

    let objectStore = db.transaction("items","readwrite").objectStore("items");

    objectStore.openCursor().onsuccess = (e) => {

        let cursor = e.target.result;

        if (cursor && cursor.key == key) {

            cursor.update(Object.assign(cursor.value, newData));

            cursor.continue();

        }

    };

}


查看完整回答
反对 回复 2023-06-29
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信