为啥这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0
Posted
技术标签:
【中文标题】为啥这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0【英文标题】:Why is this IndexedDB put command failing? Error: DataError: DOM IDBDatabase Exception 0为什么这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0 【发布时间】:2013-06-12 10:23:04 【问题描述】:我在创建 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 );
这是一个需要这样做的错误。除非我还在做错事。
【问题讨论】:
我遇到了同样的问题。我尝试了 IDBRequest put(任何值,可选任何键);在可选参数中传递自动增量 id 并且它起作用了 【参考方案1】:错误的意思是(see here for full list):
提供给操作的数据不符合要求。
对象存储使用内联键并提供了键参数。
您指定了一个keypath
,它指示商店使用in-line keys,但是当您指定一个外键作为put
的第二个参数时,它将失败。
【讨论】:
谢谢!如果我使用 autoIncrement: true
创建了 objectStore,这会起作用吗?
如果没有密钥路径,是的,每个对象存储都有自己的密钥生成器。另见这篇文章:kristofdegrave.be/2012/02/…
@user1477388 您具体需要了解什么?如何使用外键或解决问题?
@JacquesOlivier 感谢您的跟进。我可以通过使用dataBase.createObjectStore("FileAccessHistory", keyPath: 'key', autoIncrement: true );
创建我的对象存储然后使用transaction.objectStore("FileAccessHistory").put( accessedTimestampUtc: new Date().toISOString(), fileId: file.key );
插入记录来解决我的问题。
@user1477388 很酷,很高兴您设法解决了您的问题。只是出于兴趣,我想管理我自己的密钥,所以我像这样创建了我的对象存储 - upgradeDB.createObjectStore('StaticData');
- 我插入了这样的对象 - tx.objectStore('StaticData').put(item.encryptedData, item.itemId);
- 这样 autoIncrement 和 keyPath 被“关闭” ' 我能够自己管理它。这可能不是最好的方法,但对于这个特定的实例,它是我所需要的。【参考方案2】:
我在 Internet Explorer 10 中遇到了这个函数的有趣行为。
我有像你这样的关键配置的简单存储:
keyPath: "id", autoIncrement: true
当尝试将对象放入其中并将第二个参数作为变量传递时,其值为 undefined,会引发 DataError 异常。 Firefox 和 Google Chrome 没有这种奇怪的行为。
似乎,IE10 在其实现中检查参数长度,而不是检查是否定义了第二个参数。我因此遇到了很多问题,所以我希望我的回答能帮助其他将在 IE10 中面临这个异常的人。
这是example。
【讨论】:
以上是关于为啥这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0的主要内容,如果未能解决你的问题,请参考以下文章
如果在检查使用 hashmap 解决 Leetcode 二和的解决方案之前执行 map.put,为啥会失败?