【问题标题】:Using IndexedDB Like SQL. Query with multiple index values that are not in a range像 SQL 一样使用 IndexedDB。使用不在范围内的多个索引值进行查询
【发布时间】:2019-05-19 19:08:48
【问题描述】:

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

Select * FROM questions WHERE `id` in (2,45,17)

但是当涉及到 indexedDB 时,我的选择似乎有限。我发现我可以连续执行多个请求,但是如果事先不知道要选择多少个请求,我该怎么做呢?

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

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,因为我可能会更容易地做到这一点,但它受到了赞赏。

附言 除了正确答案的 +Rep 之外,我还会包含一个返回此问题的链接。

【问题讨论】:

    标签: javascript indexeddb database-indexes


    【解决方案1】:

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

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

    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

    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
      }
    }
    

    【讨论】:

    • 您发布的第一个是我作为最后手段提出的,因为我不想为了获得一些随机索引。第二个选项看起来可行。在我将其标记为已解决之前,我只需要自己尝试并确保它有效,但它已经被赞成。我想我的搜索能力不如从前了。
    • IndexDB 的游标和过滤是一团糟
    • 我真的希望 mozilla 在决定取消 WebSQL 时能够考虑包含 sql 的一些优点,因为这会让我的生活更轻松。我认为处理它时会一团糟,但没有更好的选择。我希望他们在设计阶段能更好地考虑这一点。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2018-12-19
    • 1970-01-01
    • 2014-01-12
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多