为什么这个IndexedDB put命令失败了?错误:DataError:DOM IDBDatabase异常0

时间:2013-06-16 07:07:27

标签: html5 google-chrome indexeddb

我在创建对象时已成功将以下内容添加到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 spec表示应该允许第二个参数:

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

但是,它不起作用,但可以正常工作

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

这是一个要求它的错误。除非我还在做错事。

2 个答案:

答案 0 :(得分:12)

错误表示(see here for full list):

  

提供给某项业务的数据不符合要求。

  

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

您指定的keypath指示商店使用in-line keys,但是当您指定一个外线键作为put的第二个参数时,它将失败。

答案 1 :(得分:3)

我在Internet Explorer 10中遇到了此功能的有趣行为。

我的存储空间与您的密钥配置一样简单:

{ keyPath: "id", autoIncrement: true }

当尝试将对象放入其中并将第二个参数作为变量传递时,其值为未定义,则会引发DataError异常。 Firefox和谷歌浏览器没有这种奇怪的行为。

看来,IE10在其实现中检查参数长度,而不是检查是否定义了第二个参数。因为它我遇到了很多问题,所以,我希望,我的答案将有助于其他人,他们将在IE10中面对这个例外。

这是example