像 SQL 一样使用 IndexedDB。使用不在范围内的多个索引值进行查询

133794m3r

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

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

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

这是我正在使用的当前 JavaScript。显然这行不通。我已经创建了一个名为“practice_materials”的 indexedDB 数据库,创建了一个名为“questions”的对象库,通过 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

唯一的事情是你必须为你的浏览器构建它,这是值得的,有承诺并且能够等到事务完成。(主要是在打开数据库,获取索引,选择对象存储等时,数据的设置不没有那么重要,但它仍然很好。PS 我将把它用于问答系统作为解剖学学生的学习助手。它将从每一章中选择随机数量的问题(即我已经做了),范围是 15-25,随机选择问题。我会使用 WebSQL,因为我可能可以更容易地做到这一点,但我很感激。

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

兰迪·卡斯本

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

使用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 游标:

归属:改编自:这里

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在SQL中使用像Like一样的多个值

来自分类Dev

像总结一样使用崩溃

来自分类Dev

像toggleclass一样使用.css

来自分类Dev

像toggleclass一样使用.css

来自分类Dev

使用像按钮一样的图像

来自分类Dev

像scp一样使用sftp

来自分类Dev

像 UISwitch 一样使用 UISegmentedControl

来自分类Dev

如何像以前使用 Access 一样使用 SQL 数据库?

来自分类Dev

像普通的sql一样查询hbase

来自分类Dev

如何像查询精确值一样使用MySQL

来自分类Dev

像SQL一样的高级cmd

来自分类Dev

如何像使用接口一样使用枚举?

来自分类Dev

如何像使用接口一样使用枚举?

来自分类Dev

我不能像往常一样使用洪水

来自分类Dev

Xamarin“命名空间,但像类型一样使用”错误

来自分类Dev

“ x”是“变量”,但像“方法”一样使用

来自分类Dev

如何像Java一样使用C ++实现printstacktrace

来自分类Dev

“是字段,但像类型一样使用”错误

来自分类Dev

像功能一样使用Excel工作簿

来自分类Dev

如何使用.htaccess使url像目录样式一样

来自分类Dev

可以像普通相机一样使用pixy

来自分类Dev

如何像Stata一样在R中使用滞后

来自分类Dev

在我的文本中像变量一样使用sharedPreferences

来自分类Dev

像İnVprintf一样使用带有参数的Sprintf

来自分类Dev

像工厂一样使用提供程序

来自分类Dev

像表达式一样使用foreach

来自分类Dev

像类/结构一样使用工会

来自分类Dev

像InStr函数一样使用PatIndex和CharIndex

来自分类Dev

使用pip安装的脚本:像命令一样运行