【问题标题】:How to get the (autoincremented) id of an object added to an IndexedDB by objectstore.add()?如何获取通过objectstore.add()添加到IndexedDB的对象的(自动增量)id?
【发布时间】:2020-08-31 11:25:24
【问题描述】:

我正在开发一个 WebExtension 并使用 IndexedDB 来存储对象。当我存储一个新对象时,它不会是唯一的。因此,我使用自动递增的 id 使其独一无二。在第一次添加之后,我将做一些工作,修改/更新一些属性,因此必须更新数据库中的对象。但是要更新一个对象,我需要知道它的 ID,目前我还不知道。

这是我将对象添加到数据库的代码:

const dbName = "MyDb";
const dbVersion = 1;
const storeName = "MyStore";

function addObject(obj) {
    const request = window.indexedDB.open(dbName, dbVersion);
    request.onupgradeneeded = event => {
        const db = event.target.result;
        const objectStore = db.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });
    }
    request.onsuccess = event => {
        const db = event.target.result;
        const transaction = db.transaction(storeName, 'readwrite');
        const objectStore = transaction.objectStore(storeName);
        objectStore.add(obj);
        transaction.onerror = event => {
            console.error('Error while adding an object: ', event.target.error.message);
        };
        // How do I get/return the ID of the previously added object?
        transaction.onsuccess = event => {
            console.log(event.target.result);
        };
        transaction.oncomplete = event => {
            console.log(event.target.result);
        };
    }
}

addObject({prop1: "foo", prop2: "bar", prop3: "", prop4: ""});

类似问题的答案-herehere-添加成功后建议查询event.target.result,但在上面的代码中返回undefined,虽然对象已经插入成功。

那么,有没有办法获取刚刚添加的对象的ID呢?

【问题讨论】:

  • 与请求相关的成功事件,而不是事务。有区别。
  • 如果将console.log(event.target.result); 更改为console.log(event); 会怎样?这些事件的内容是什么?
  • @Josh Thx,就是这样!

标签: javascript indexeddb


【解决方案1】:

原来,我听错了事件处理程序。而不是听onsuccess/oncomplete 的事务,你必须听onsuccess 的查询。

此外,我将所有内容都打包到 Promise 中,以便能够在 ID 可用时立即获取它。

这是工作示例:

const dbName = "MyDb";
const dbVersion = 1;
const storeName = "MyStore";

function addObject(obj) {
    return new Promise(function(resolve) {
        const request = window.indexedDB.open(dbName, dbVersion);
        request.onupgradeneeded = event => {
            const db = event.target.result;
            const objectStore = db.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });
        };
        request.onsuccess = event => {
            const db = event.target.result;
            const transaction = db.transaction(storeName, 'readwrite');
            const objectStore = transaction.objectStore(storeName);
            const query = objectStore.add(obj);
            transaction.onerror = event => {
                console.error('Error while adding an object: ', event.target.error.message);
            };
            query.onsuccess = event => {
                return resolve(event.target.result); // OR: return resolve(query.result);
            };
        };
    });
}

let id = await addObject({prop1: "foo", prop2: "bar", prop3: "", prop4: ""});

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多