IndexedDB IDBObjectStore,添加错误:“无法将生成的密钥插入值”

brvekthn  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(185)

我尝试向对象存储区添加一些值,但在返回时(在第22行)得到以下错误。对象存储区使用keyPath 'id'和自动增量:是的。

function cacheObject(storeName, object) {
  return new Promise(function(resolve, reject) {
    let transaction = db.transaction([storeName], "readwrite");

    transaction.oncomplete = function(event) {
      console.log("Transaction complete");
      resolve(object);
    };

    transaction.onabort = function(event) {
      console.log("Transaction aborted: " + event);
      reject();
    };

    transaction.onerror = function (event) {
      console.log("Transaction error: "+  event.toString());
      reject();
    };

    let objectStore = transaction.objectStore(storeName);

    let objectReq = objectStore.add(object);
    objectReq.onsuccess = function (event) {
      console.log("saved object to idb: " + JSON.stringify(object));
    };
  });
}

以下是onupgradeneeded事件的范例:

req.onupgradeneeded = function (e) {
    let db = e.target.result;
    console.log("Running idb onupgradeneeded");
    if (!db.objectStoreNames.contains(STORY_STORE_NAME)) {
      let storyStore = db.createObjectStore(STORY_STORE_NAME, {keyPath: "id", autoIncrement: true});
      storyStore.createIndex('picture', 'picture', {unique: false});
      storyStore.createIndex('text', 'text', {unique: false});
      //more indexes created here
aor9mmx1

aor9mmx11#

我找到了原因和解决办法
简而言之,store.add值不是对象({}),因此object.id = autoGeneratedId将引发错误
在我例子中,我使用

database.createObjectStore(storeName, {
                keyPath: 'id',
                autoIncrement: true
            })

并使用事务获取存储

store2.add(1)
            store2.add(2)

1.id =“瓦尔”将引发错误
当我将其更改为store2.add({k: "v"})时,它修复了

相关问题