11

如果键已存在,则将对象添加到 IndexedDB objectStore 将失败。我如何使用给定的键检查对象的存在——最好是同步的(没有理由需要另一层回调)并且不拉动对象。

我知道如何通过事务异步获取请求,但每次我想添加一个对象时似乎有点考验。

note解决方案只需要在 Chrome 中工作(如果有帮助的话)

4

4 回答 4

17

检查密钥是否存在的最佳方法是 objectStore.count(key)。这是异步的。

在您的情况下,最好的选择是您的密钥的 openCursor 。如果存在,光标会出现。

var req = objectStore.openCursor(key);
req.onsuccess = function(e) {
  var cursor = e.target.result; 
  if (cursor) { // key already exist
     cursor.update(obj);
  } else { // key not exist
     objectStore.add(obj)
  }
};
于 2013-03-10T00:55:11.233 回答
8

到目前为止,所有浏览器都没有实现同步 API,因此您将不得不异步进行。AnobjectStore公开了一个get方法,您为它提供了一个键,它将返回与该键匹配的对象(或 null)。

MDN 上有一个非常好的教程,其中涵盖了使用 IDB,也涵盖了获取记录,但内联代码是:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) {
  alert("Name for SSN 444-44-4444 is " + event.target.result.name);
};

如果您不想检索记录,那么您始终可以按照规范中的count说明在索引上使用该方法。根据您可以使用或修改记录的结果,如果您不需要,它将保存提取记录。addput

于 2013-03-10T23:47:35.327 回答
8

答案有点晚,但可能对其他人有帮助。我仍然偶然发现 - 正如我猜想的那样 - 相同的问题,但它非常简单:

如果您想插入或更新您使用的记录objectStore.put(object) (帮助)
如果您只想插入您使用的记录objectStore.add(object) (帮助)

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

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

于 2016-04-24T09:28:09.390 回答
1

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

你可以使用自动增量,这样你就不需要检查一个键是否存在,你总是会得到一个唯一的。

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

一切都取决于您要检查某物是否存在的原因。

于 2013-03-11T09:31:05.613 回答