如何检查在IndexedDB中是否找不到键?

mpbci0fu  于 2023-02-27  发布在  IndexedDB
关注(0)|答案(3)|浏览(209)

在indexeddb上,我想看看是否有一个键permanent,并执行一些操作。但如果没有,我想执行一些其他操作。如果permanent存在,我可以执行这些操作,但如果没有,我可以让onerror工作。onerror应该做这件事吗?我如何检查它是否没有值?

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

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

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

lfapxunr1#

请参阅www.example.com下的注解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;
    }
};
hm2xizp9

hm2xizp92#

分配给request.onsuccess的函数是一个回调函数,无论存储区中是否存在该值,该函数都将被调用。当存储区中没有对应的对象时,结果对象将是未定义的。当存储区中存在对应的对象时,结果对象将被定义。因此,您只需检查对象是否是从onsuccess回调函数中定义的。
onerror是一个独立于request.onsuccess.onerror的回调函数,当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。在get请求的情况下没有这样的操作。使用store.get时,request.result包含所需的匹配对象,或者未定义。使用store.openCursor时,request.result包含游标,如果至少有一个匹配对象并且您尚未遍历过它,则定义游标。要在游标的当前位置获取匹配对象,你可以使用cursor.value。这里,cursor.value总是被定义的,因为cursor是未定义的,你应该事先检查一下。

vptzau2j

vptzau2j3#

与其使用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");
  }

相关问题