如果密钥已存在,则将对象添加到IndexedDB objectStore将失败。如何检查具有给定键的对象是否存在 - 最好是同步(没有其他层次的回调)并且不拉动对象。
我知道如何通过事务异步获取请求,但每次想要添加对象时都要经历一些考验。
note 解决方案只能在Chrome中运行(如果有帮助)
答案 0 :(得分:12)
检查密钥是否存在的最佳方法是objectStore.count(key)。哪个是异步的。
在您的情况下,最好的选择是您的密钥的openCursor。如果存在,则会出现光标。
var req = objectStore.openCursor(key);
req.onsuccess = function(e) {
var cursor = e.target.target;
if (cursor) { // key already exist
cursor.update(obj);
} else { // key not exist
objectStore.add(obj)
}
};
答案 1 :(得分:7)
到目前为止,没有一个浏览器实现了同步API,因此您将不得不进行异步。 objectStore
公开了一个get
方法,您为它提供了一个键,它将返回与该键匹配的对象(或null)。
有一个非常好的MDN教程,涵盖了使用IDB,getting a record也被涵盖,但内联代码是:
db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};
如果您不想检索记录,那么您可以始终在索引here in the spec上使用count
方法。根据结果,您可以使用add
或put
来修改记录,如果您不需要,它将保存提取记录。
答案 2 :(得分:3)
答案有点迟,但可能有助于其他人。我仍然偶然发现 - 我猜 - 同样的问题,但它很简单:
如果您想要INSERT或UPDATE记录,请使用objectStore.put(object)
(help)
如果您只想INSERT记录,请使用objectStore.add(object)
(help)
因此,如果您使用add(object)
,并且DB中仍然存在记录密钥,则不会覆盖并触发错误0“ConstraintError:密钥已存在于对象库中”。
如果您使用put(object)
,它将被覆盖。
答案 3 :(得分:1)
问题是你为什么想知道这个?也许你应该使用另一种方法?
您可以使用自动增量,这样您就不需要检查是否存在某个键,您将始终获得一个唯一的键。
您也可以使用put方法而不是add方法。如果密钥存在,则数据将被更新,如果密钥不存在,则添加数据。
一切都取决于你想检查某些东西是否存在的原因。