为啥这个 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,为啥会失败?

在 indexeddb 中添加和放入有啥区别?

为啥这个错误会出现在命令提示符中?

为啥 IndexedDB 在 node.js 中不可用? [关闭]

php为啥上传图片会失败

为啥使用vue时,使用put方式访问后台报错,get正常?