36

我最近(遗憾地)发现 HTML5 不再支持 WebSQL,而 IndexedDB 将取而代之。

我想知道是否有任何方法可以查询或搜索 IndexedDB 的条目,其方式类似于我如何使用 SQL 搜索满足多个条件的条目。

我已经看到我可以使用 KeyRange 的一个条件来搜索 IndexedDB。但是,如果不从数据库中获取所有数据并使用 for 循环,我似乎找不到任何方法来搜索两列或多列数据。

我知道这是一个几乎没有在浏览器中实现的新功能,但我有一个正在启动的项目,我正在研究我可以做到的不同方法。

谢谢!

4

5 回答 5

38

查看同一问题的答案。它比我在这里给出的答案更详细。store.createIndex 和 IDBKeyRange 方法的 keypath 参数可以是一个数组。所以,粗略的例子:

// In onupgradeneeded
var store = db.createObjectStore('mystore');
store.createIndex('myindex', ['prop1','prop2'], {unique:false});

// In your query section
var transaction = db.transaction('mystore','readonly');
var store = transaction.objectStore('mystore');
var index = store.index('myindex');
// Select only those records where prop1=value1 and prop2=value2
var request = index.openCursor(IDBKeyRange.only([value1, value2]));
// Select the first matching record
var request = index.get(IDBKeyRange.only([value1, value2]));
于 2013-03-24T16:16:55.640 回答
6

假设您的 SQL 查询类似于:

SELECT * FROM TableName WHERE Column1 = 'value1' AND Column2 = 'value2'

JsStore库中的等效查询:

var Connection = new JsStore.Instance("YourDbName");
Connection.select({
    From: "YourTableName"
    Where: {
        Column1: 'value1',
        Column2: 'value2'
    },
    OnSuccess:function (results){
        console.log(results);
    },
    OnError:function (error) {
        console.log(error);
    }
});

现在,如果您想知道 JsStore 是什么,让我告诉您它是一个以简化方式查询 IndexedDB 的库。点击这里了解更多关于JsStore

于 2017-09-05T07:29:39.190 回答
1

我在回答这个问题时提到了一些关于查询关系的建议,这可能很有趣:

IndexedDB 的概念问题(关系等)

至于一次查询多个字段,在 IndexedDB 中似乎没有本地方法可以做到这一点(我可能错了;我还是新手),但您当然可以创建一个使用单独的辅助函数每个字段的光标,并遍历它们以查看哪些记录符合所有条件。

于 2012-01-15T03:24:09.213 回答
1

是的,在索引上打开连续键范围几乎就是 indexedDB 中的内容。在 IndexedDB 中无法测试多个条件。它必须在游标循环上完成。

如果您找到解决方案,请告诉我。

顺便说一句,我认为循环游标可能非常快,并且比使用 Sqlite 需要的内存更少。

于 2012-09-03T15:26:23.870 回答
1

我迟到了几年,但我只想指出,乔希的回答是基于条件中的所有“列”都是索引的一部分的假设keyPath

如果任何上述“列”存在于索引之外keyPath,则必须在示例中创建的游标迭代的每个条目上测试涉及它们的条件。因此,如果您正在处理此类查询,或者您的索引不是unique,请准备好编写一些迭代代码!

无论如何,如果您可以将查询表示为布尔表达式,我建议您查看BakedGoods 。

对于这些类型的操作,它将始终在焦点 objectStore 上打开一个游标,除非您正在执行严格的相等查询(x ===? y给定 x 是一个 objectStore 或索引键),但它会为您省去编写自己的游标迭代代码的麻烦:

bakedGoods.getAll({
    filter: "keyObj > 5 && valueObj.someProperty !== 'someValue'",
    storageTypes: ["indexedDB"],
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});

只是为了完全透明,BakedGoods 由moi维护。

于 2016-07-09T15:51:26.490 回答