检查IndexedDB objectStore是否已包含密钥

Chr*_*ris 9 google-chrome indexeddb

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

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

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

Kya*_*Tun 14

检查密钥是否存在的最佳方法是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)
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 是的,这似乎是我想要的最接近的东西.堆在承诺上! (2认同)
  • @Kyaw Tun应该是var cursor = e.target.result而不是e.target.target吗? (2认同)

Lut*_*utz 8

回答有点晚了,但可能对其他人有帮助。我仍然在同一个问题上绊倒了 - 正如我猜想的那样,但这很简单:

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

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

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


Aar*_*ell 7

到目前为止,没有一个浏览器实现了同步API,因此您将不得不进行异步.一个objectStore暴露了get,你为它提供的重要手段,它会回报你的密钥相匹配的对象(或空).

有一个非常好的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);
};
Run Code Online (Sandbox Code Playgroud)

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