Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Indexeddb获取特定ID_Javascript_Indexeddb - Fatal编程技术网

Javascript 从Indexeddb获取特定ID

Javascript 从Indexeddb获取特定ID,javascript,indexeddb,Javascript,Indexeddb,在我的项目中,我使用的是浏览器的索引数据库,我想用特定的ID从数据库中检索一些对象。根据需要,您可以使用范围来获得所需的结果: 根据MDN: // Only match "Donna" var singleKeyRange = IDBKeyRange.only("Donna"); // Match anything past "Bill", including "Bill" var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill"); //

在我的项目中,我使用的是浏览器的索引数据库,我想用特定的ID从数据库中检索一些对象。根据需要,您可以使用范围来获得所需的结果:

根据MDN:

// Only match "Donna"
var singleKeyRange = IDBKeyRange.only("Donna");

// Match anything past "Bill", including "Bill"
var lowerBoundKeyRange = IDBKeyRange.lowerBound("Bill");

// Match anything past "Bill", but don't include "Bill"
var lowerBoundOpenKeyRange = IDBKeyRange.lowerBound("Bill", true);

// Match anything up to, but not including, "Donna"
var upperBoundOpenKeyRange = IDBKeyRange.upperBound("Donna", true);

// Match anything between "Bill" and "Donna", but not including "Donna"
var boundKeyRange = IDBKeyRange.bound("Bill", "Donna", false, true);

// To use one of the key ranges, pass it in as the first argument of openCursor()/openKeyCursor()
index.openCursor(boundKeyRange).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    // Do something with the matches.
    cursor.continue();
  }
};

但是,如果您希望通过单个请求获得一个不有序且不连续的特定id数组(例如:[91819,34,24501]),您该怎么办?

根据您的评论,听起来您想从object.id=1或object.id=2或object.id=5的对象中选择对象,作为单个查询(请求)。不幸的是,indexedDB无法执行
样式的查询(联合)。它只能执行
样式查询(交叉点)


如果要检索的各种ID是先验已知的,那么有一种可能的解决方案。您可以简单地存储一个附加的组id属性,将相关id放入不同的组中,然后按组id进行查询。如果要检索的id重叠(出现在多个组中),或者是可变的(对象到组的成员资格在不同的查询中更改),则这显然不起作用

您不能用一个请求来执行此操作,但您可以同时发出多个请求:

var keys = [91,819,34,24,501];
var results = [];
keys.forEach(function(key) {
  store.get(key).onsuccess = function(e) {
    results.push(e.target.result);
    if (results.length === keys.length) {
       // you're done!
    }
  };
});
请注意,请求需要按顺序执行,因此
结果
数组的顺序将与
数组的顺序匹配。如果找不到键,相应的结果索引将包含
未定义的


(有一个直接支持索引数据库的功能请求:但还没有最终的API设计。)

使用光标可以通过一键一键获得多个对象

这些钥匙需要分类

var keys = [91,819,34,24,501].sort(function(a, b) {
   return a - b;
});
var results = [];
var i = 0;
var cursorReq = store.openCursor();
cursorReq.onsuccess = function(e) {
   var c = e.target.result;
   if(!c) { return; /* done */ }
   while(c.key > keys[i]) {
      i++;
      if(i === keys.length) { return; /* done */ }
   }
   if(c.key === keys[i]) { // found
      results.push(cursor.value);
      c.continue();
   } else { c.continue(keys[i]); }
}

很抱歉造成混淆,我想完成的是使用这些ID[91819,34,24501]检索5条记录(对象),但只使用一个请求,而不使用光标。如果我想要的ID是例如[1,2,3,4,5],那么我可以使用“IDBKeyRange.bound”,但它们既不按顺序也不按顺序排列。我可能想要id为91的对象,而不是id为92的对象,只要id为[91819,34,24501]的对象就可以了。