我在创建对象时已成功将以下内容添加到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 } );
这是一个要求它的错误。除非我还在做错事。
答案 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。