使用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”:对象存储区使用内嵌键,并且提供了键参数。
1条答案
按热度按时间umuewwlo1#
关于unmet conditions when inserting data的一个明显不相关的答案给了我一个错误的最终想法。当指定
keyPath
值时,没有创建单独的主键,但是键路径中给出的字段被用作主键(内联键)。MDN文档中对这方面的描述很糟糕:key path定义浏览器应该从对象存储或索引中的哪个位置提取key。有效的key路径可以包括以下内容之一:空字符串、JavaScript标识符、由句点分隔的多个JavaScript标识符或包含其中任何一种的数组。它不能包含空格。
什么是“密钥”,如何从对象存储中提取密钥?
无论如何,这里的解决方案是根本不指定密钥:
但只有密钥生成器(
autoIncrement
)。我假设值keyPath
是一个自动值(因为如果它引用数据中的一个字段,它不能自动更改)。