14

我在创建 objectStore 时已成功将以下内容添加到它:

{ name: "John Doe", age: 21 }

我使用了以下选项:

{ keyPath: "id", autoIncrement: true }

我能够找到该记录,它显示id = 1. 但是,当我在下面运行此命令时,它会引发错误:

var store = db.transaction( [ "employees" ], "readwrite" ).objectStore( "employees" );
var request = store.put( { name: "John Doe", age: 32 }, 1 );

这抛出:

DataError: DOM IDBDatabase Exception 0

有谁知道出了什么问题?我是否错误地指定了密钥?

更新

IndexedDB 规范指出应该允许第二个参数:

interface IDBObjectStore {
    ...
    IDBRequest put (any value, optional any key);
    ...
};

但是,它不起作用,但这确实起作用

store.put( { name: "John Doe", age: 32, id: 1 } );

这是一个需要这样做的错误。除非我仍然在做错事。

4

2 回答 2

23

错误意味着(完整列表请参见此处):

提供给操作的数据不符合要求。

对象存储使用内联键并提供了 key 参数。

您正在指定一个keypath指示商店使用in-line keys 的方法,但是当您指定一个 out-of-line key 作为第二个参数时put,它将失败。

于 2013-06-16T07:25:43.363 回答
3

我在 Internet Explorer 10 中遇到了这个函数的有趣行为。

我有像你这样的关键配置的简单存储:

{ keyPath: "id", autoIncrement: true }

当尝试将对象放入其中并将第二个参数作为变量传递时,其值为undefined,引发 DataError 异常。Firefox 和 Google Chrome 没有这种奇怪的行为。

看来,IE10 在其实现中检查参数长度,而不是检查是否定义了第二个参数。我因此遇到了很多问题,所以,我希望我的回答能帮助其他将在 IE10 中面临这个异常的人。

这是一个例子

于 2013-10-11T12:20:35.817 回答