检查IndexedDB objectStore是否已包含密钥

时间:2013-03-09 02:54:09

标签: google-chrome indexeddb

如果密钥已存在,则将对象添加到IndexedDB objectStore将失败。如何检查具有给定键的对象是否存在 - 最好是同步(没有其他层次的回调)并且不拉动对象。

我知道如何通过事务异步获取请求,但每次想要添加对象时都要经历一些考验。

note 解决方案只能在Chrome中运行(如果有帮助)

4 个答案:

答案 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方法。根据结果​​,您可以使用addput来修改记录,如果您不需要,它将保存提取记录。

答案 2 :(得分:3)

答案有点迟,但可能有助于其他人。我仍然偶然发现 - 我猜 - 同样的问题,但它很简单:

如果您想要INSERT或UPDATE记录,请使用objectStore.put(object) (help)
如果您只想INSERT记录,请使用objectStore.add(object) (help)

因此,如果您使用add(object),并且DB中仍然存在记录密钥,则不会覆盖并触发错误0“ConstraintError:密钥已存在于对象库中”。

如果您使用put(object),它将被覆盖。

答案 3 :(得分:1)

问题是你为什么想知道这个?也许你应该使用另一种方法?

您可以使用自动增量,这样您就不需要检查是否存在某个键,您将始终获得一个唯一的键。

您也可以使用put方法而不是add方法。如果密钥存在,则数据将被更新,如果密钥不存在,则添加数据。

一切都取决于你想检查某些东西是否存在的原因。

相关问题