首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用IndexedDB,比如SQL。多个索引值不在某个范围内的查询

使用IndexedDB,比如SQL。多个索引值不在某个范围内的查询
EN

Stack Overflow用户
提问于 2019-05-20 03:08:49
回答 1查看 1.6K关注 0票数 0

基本上,我希望选择与索引/键匹配的所有值,但它们不在编程范围内。它必须能够选择一定范围的请求(一次选择一个可变的数量)。在SQL中,我会这样做。

代码语言:javascript
复制
Select * FROM questions WHERE `id` in (2,45,17)

但当涉及到indexedDB时,我的选择似乎是有限的。我发现我可以连续处理多个请求,但在事先不知道要选择多少个请求的情况下,我怎么做呢?

下面是我正在使用的当前JavaScript。显然这是行不通的。我已经创建了一个名为"practice_materials“的indexedDB数据库,创建了一个名为"questions”的对象存储,按id建立了索引,并将数据放入其中。

代码语言:javascript
复制
window.idb=window.indexedDB;
     var request=indexedDB.open(db_name,db_version);
request.onerror=function(event){
    console.log('error:'+event);
}
request.onsuccess=function(event){
  db_res=request.result;
}
var tx=db_res.transaction([obj_store]).objectStore(obj_store);
var res='';     
var out_obj=[];
var id=[2,45,17];
for(i=0;i<3;++i){
    request=tx.get(id[i]);
    request.onsuccess=function(event){
    out_obj.push(request.result);
    }
}

任何未来遇到这个问题的人。利用idb走出回调地狱,这样您就可以让代码等到数据库/其他事务完成后再尝试访问它。

https://github.com/jakearchibald/idb

唯一一件事是你必须为你的浏览器构建它,这是值得的,因为它有承诺并且能够等待直到事务完成。(主要是在打开数据库,获取索引,选择对象存储等时,数据的设置并不重要,但仍然很好。附言:我将使用这个问答系统,作为解剖学学生的学习助手。它将从每个章节中随机选择一些问题(我已经做了),范围从15到25,问题是随机选择的。我会使用WebSQL,因为我可能会更容易做到这一点,但它得到了人们的赞赏。

附注。除了一个+代表正确的答案,我会包括一个链接回到这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-20 05:47:35

没有直接的途径来模拟SQL in语句。这里有两个解决方案。

使用Array.prototype.filter() (有人可能会说两行代码很容易)

代码语言:javascript
复制
const filter = [2,45,17];
const fieldToFilter = "someField";
objectStore.getAll().onsuccess = function(event) {
  const filtered = event.target.result.filter(i => filter.includes(i[fieldToFilter]));
  console.log(filtered);
};

使用IndexDB游标:

归属:改编自:Here

代码语言:javascript
复制
let i = 0;
const selected = [];
const filter = [2,17,45];

myIndex.openCursor(keyRangeValue).onsuccess = function(event) {
  let cursor = event.target.result;
  if (!cursor) { // We are done
    console.log(selected); // do something with result
    return;
  } 
  var key = cursor.key;
  if (key > filter[i]) { // filter should be sorted asc
    ++i;
    if (i >= filter.length) {
      return;
    }
  }
  if (key === filter[i]) { // Use individual row
    selected.push(cursor.value); // here
    cursor.continue(); // Next
  } else {
    cursor.continue(filter[i]); // Go to the next filtered key
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56211131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档