使用 idb 包我正在尝试将新记录添加到我的应用程序数据库中。对象存储是这样创建的:
const dbEditorStore = db.createObjectStore("myStore",
{ keyPath: "id", autoIncrement: true });
dbEditorStore.createIndex("resultIndex", "resultId", { unique: false });
dbEditorStore.createIndex("tabIndex", "tabId", { unique: false });
当我现在尝试添加新数据时,没有明确给出密钥,我得到了错误
ConstraintError: Key 已经存在于对象存储中。
这是我添加数据的方式(注意缺少的关键参数):
await db.add("myStore", data);
这让我感到困惑,因为我希望对于自动递增键,我不必指定任何内容,IndexedDB 会自动处理它。
这里有什么问题,在这种情况下添加数据的正确方法是什么?
更多信息:当我在
add
调用中指定键名时,我得到一个不同的错误:
DataError:无法在“IDBObjectStore”上执行“添加”:对象存储使用内联键并提供了键参数。
关于 unmet conditions when inserting data 的一个明显无关的答案让我最终知道出了什么问题。当指定
keyPath
值时,不会创建单独的主键,但键路径中给出的字段用于主键(内联键)。 MDN 文档中对这方面的描述很糟糕:
关键路径 定义浏览器应从对象存储或索引中的何处提取密钥。有效的键路径可以包括以下内容之一:一个空字符串、一个 JavaScript 标识符或多个由句点分隔的 JavaScript 标识符或包含其中任何一个的数组。它不能包含空格。
什么是“密钥”以及如何从对象存储中提取密钥?
无论如何,这里的解决方案是根本不指定密钥:
const dbEditorStore = db.createObjectStore("myStore", { autoIncrement: true });
但只有密钥生成器(
autoIncrement
)。我假设值 keyPath
将是一个自动值(因为它不能自动更改,如果它指的是数据中的字段)。