如何检查IndexedDB中是否找不到密钥?

时间:2016-05-06 14:26:18

标签: javascript jquery indexeddb

在indexeddb上,我想查看是否有密钥permanent并执行某些操作。但如果没有,我想做一些其他的行动。如果permanent存在,我可以执行操作,但是如果不存在,我可以让错误工作。 onerror是否想要做这件事?如何检查其中是否没有值?

var hashtype='permanent';
    var getPermanent = store.get(hashtype);

getPermanent.onsuccess = function() {
    var ivrame=getPermanent.result.value;
};

getPermanent.onerror = function() {
  console.log('onerror')
};

3 个答案:

答案 0 :(得分:5)

请参阅https://w3c.github.io/IndexedDB/#dom-idbobjectstore-get下的注释 - 如果没有匹配的记录,get方法会使undefined成功。

所以你有几个选择:

  • 使用get(key)并测试undefined的结果。除非undefined是您希望存储的值(它是有效值)
  • ,否则此方法有效
  • 使用count(key) - 如果存在则结果为1,如果不存在则结果为0。如果您只是为了存在而进行测试,那就太容易了,但是没有给您带来记录。
  • 使用openCursor(key)并测试以查看请求的result是否为游标(记录显示为request.result.value)或undefined(范围内无记录)

代码:

var hashtype='permanent';

// #1: Use get
var getPermanent = store.get(hashtype);
getPermanent.onsuccess = function() {
    if (getPermanent.result === undefined) {
        // no record with that key
    } else {
        var value = getPermanent.result;
    }
};

// #2: Use count
var getPermanent = store.count(hashtype);
getPermanent.onsuccess = function() {
    if (getPermanent.result === 0) {
        // no record with that key
    } else {
        ...
    }
};

// #3: Use cursor
var getPermanent = store.openCursor(hashtype);
getPermanent.onsuccess = function() {
    var cursor = getPermanent.result;
    if (!cursor) {
        // no record with that key
    } else {
        var value = cursor.value;
    }
};

答案 1 :(得分:0)

分配给request.onsuccess的函数是一个始终被调用的回调函数,无论该值是否存在于商店中。当商店中没有相应的对象时,结果对象将是未定义的。当商店中有相应的对象时,将定义结果对象。因此,您只需要检查是否在onsuccess回调函数中定义了对象。

request.onerror是request.onsuccess的单独回调。当indexedDB中存在某种类型的失败时会调用onerror(例如,您尝试从不存在的商店中获取值,或者您试图将重复的对象放入不存在的商店中允许重复)。 request.onerror在调用store.get时没有找到值时会调用 not ,因为这不会被视为错误'在失败的意义上。

所以,你想要做的是这样的事情:

var hashtype='permanent';
var getPermanent = store.get(hashtype);

getPermanent.onsuccess = function(event) {
  //var ivrame=getPermanent.result.value;

  var result = getPermanent.result;
  if(result) {
    console.log('Got a result!', result);
    var ivrame = result;
  } else {
    console.log('Result was undefined! No matching object found');
  }
};

getPermanent.onerror = function() {
  console.log('Something went wrong trying to perform the get request');
};

请勿尝试访问request.result.value。在获取请求的情况下没有这样的事情。当使用store.get时,request.result包含您想要的匹配对象,或者是未定义的。当使用store.openCursor时,request.result包含游标,如果至少有一个匹配对象并且您尚未迭代它,则定义游标。要在光标的当前位置获取匹配对象,可以使用cursor.value。在这里,将始终定义cursor.value,因为否则游标将是未定义的,您显然会事先检查它。

答案 2 :(得分:0)

与其使用getPermanent.result来访问'get'请求提供的数据,不如使用event.target.result.,它也可以与undefined进行比较,以检查是否缺少请求的密钥:

  db = this.result;
  var tr = db.transaction("data");
  var objstore = tr.objectStore("data");
  var getres = objstore.get(0);
  getres.onsuccess = function(event)
  {
    if(event.target.result.data === undefined)
      console.log("key not found");
  }