在没有显式密钥的情况下添加新记录时出错(改为使用自动 inc 密钥)

问题描述 投票:0回答:1

使用 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”上执行“添加”:对象存储使用内联键并提供了键参数。

indexeddb
1个回答
1
投票

关于 unmet conditions when inserting data 的一个明显无关的答案让我最终知道出了什么问题。当指定

keyPath
值时,不会创建单独的主键,但键路径中给出的字段用于主键(内联键)。 MDN 文档中对这方面的描述很糟糕:

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

什么是“密钥”以及如何从对象存储中提取密钥?

无论如何,这里的解决方案是根本不指定密钥:

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

但只有密钥生成器(

autoIncrement
)。我假设值
keyPath
将是一个自动值(因为它不能自动更改,如果它指的是数据中的字段)。

© www.soinside.com 2019 - 2024. All rights reserved.