在IndexedDB中搜索不存在的密钥objectStore仍然会返回成功

时间:2012-11-13 21:39:37

标签: google-chrome indexeddb

我正在尝试查看objectStore中是否已存在条目。如果条目存在,我需要改变它的一些字段;如果该条目不存在,我需要添加它。

这是我的疑问:

var db = html5rocks.indexedDB.db;
  var trans = db.transaction(["topics"], "readwrite");
  var store = trans.objectStore("topics");
  var findRequest = store.get(tHash);
findRequest.onsuccess = function(event){
  console.log("logging event");
  console.log(event);
  var cursor = event.target.result;
}
findRequest.onerror(e){
console.log(e);
}

我遇到的问题是findRequest.onsuccess函数总是触发 - 即使get(tHash)请求不可能找到任何东西(顺便说一句,“topic”对象存储包含零条目我这样做......)。 我想我会使用onsuccessonerror函数来判断我是否需要更新现有记录或创建新记录。我做错了什么?

1 个答案:

答案 0 :(得分:5)

直接来自horse's mouth

  如果具有给定键的记录不存在,如记录存在但未定义为值,则

IDBObjectStore.get()会产生相同的结果。如果您需要区分两种情况,可以使用相同密钥的openCursor。如果存在记录,这将返回未定义为value的游标,如果不存在此类记录,则返回游标。

我想你想要这样的东西:

var cursorRequest = store.openCursor(tHash);
cursorRequest.onsuccess = function(event) {
  var cursor = event.result;
  if (cursor) {
    // entry exists
  } else {
    // entry doesn't exist
  }
}