【问题标题】:How to update an IndexedDB item with autoincrement key? [duplicate]如何使用自动增量键更新 IndexedDB 项目? [复制]
【发布时间】:2021-02-13 07:11:10
【问题描述】:

我使用 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 不包含有关其密钥的任何信息。那么如何更新这样一个对象存储中的元素呢?

【问题讨论】:

  • @Josh yup.. 这是重复的.. 抱歉,在询问之前我已尽力搜索.. 谢谢您的评论。

标签: javascript updates auto-increment indexeddb


【解决方案1】:

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

您要更新的记录的主键(例如来自IDBCursor.primaryKey)。这仅适用于具有autoIncrement 主键的对象存储,因此该键不在记录对象的字段中。在这种情况下,调用put(item) 将始终插入一条新记录,因为它不知道您可能要修改的现有记录。

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

【讨论】:

  • 我找到了另一个解决方案,但你的也解决了这个问题,所以我接受了。谢谢!
【解决方案2】:

我使用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();
        }
    };
}

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 2017-03-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多