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

问题描述 投票:5回答:3

在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')
};
javascript jquery indexeddb
3个回答
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;
    }
};

0
投票

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

request.onerror是来自request.onsuccess的单独回调。当indexedDB中存在某种类型的失败时会调用onerror(例如,您尝试从不存在的存储中获取值,或者您尝试将重复的对象放入不允许重复的存储中)。如果由于调用store.get而未找到任何值,则不会调用request.onerror,因为在失败意义上不会将其视为“错误”。

那么,你想要做的是这样的事情:

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,因为否则游标将是未定义的,您显然会事先检查它。


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");
  }
© www.soinside.com 2019 - 2024. All rights reserved.