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

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


慕桂英3389331
浏览 109回答 2
2回答

慕盖茨4494581

您需要添加一个键作为第二个参数,例如objectStore.put(data, key)。钥匙您要更新的记录的主键(例如来自IDBCursor.primaryKey)。仅当对象存储具有主键时才需要这样做autoIncrement,因此该键不在记录对象的字段中。在这种情况下,调用put(item)总是会插入一条新记录,因为它不知道您可能想要修改哪些现有记录。-- IDBObjectStore.put() - Web API | | -- IDBObjectStore.put() - Web API | MDN

狐的传说

我找到了另一个解决方案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();        }    };}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript