IndexedDB 添加没有显式键的新记录时出错(使用auto inc键代替)

t1qtbnec  于 2023-04-18  发布在  IndexedDB
关注(0)|答案(1)|浏览(199)

使用idb包,我尝试向应用程序DB添加新记录。对象存储如下所示:

const dbEditorStore = db.createObjectStore("myStore",
    { keyPath: "id", autoIncrement: true });
dbEditorStore.createIndex("resultIndex", "resultId", { unique: false });
    dbEditorStore.createIndex("tabIndex", "tabId", { unique: false });

当我现在尝试添加新数据时,如果没有显式地给出键,就会得到错误
ConstraintError:对象存储区中已存在键。
下面是我添加数据的方式(注意缺少的关键参数):

await db.add("myStore", data);

这让我很困惑,因为我希望对于一个自动增量键,我不必指定任何东西,IndexedDB会自动处理。
这里有什么问题,在这种情况下添加数据的正确方法是什么?
更多信息:当我在add调用中指定键名时,我得到一个不同的错误:
DataError:无法在“IDBObjectStore”上执行“add”:对象存储区使用内嵌键,并且提供了键参数。

umuewwlo

umuewwlo1#

关于unmet conditions when inserting data的一个明显不相关的答案给了我一个错误的最终想法。当指定keyPath值时,没有创建单独的主键,但是键路径中给出的字段被用作主键(内联键)。MDN文档中对这方面的描述很糟糕:

key path定义浏览器应该从对象存储或索引中的哪个位置提取key。有效的key路径可以包括以下内容之一:空字符串、JavaScript标识符、由句点分隔的多个JavaScript标识符或包含其中任何一种的数组。它不能包含空格。

什么是“密钥”,如何从对象存储中提取密钥?
无论如何,这里的解决方案是根本不指定密钥:

const dbEditorStore = db.createObjectStore("myStore", { autoIncrement: true });

但只有密钥生成器(autoIncrement)。我假设值keyPath是一个自动值(因为如果它引用数据中的一个字段,它不能自动更改)。

相关问题