我最近(遗憾地)发现HTML5不再支持WebSQL,而且IndexedDB将替代它。
我想知道是否有任何方法可以查询或搜索IndexedDB的条目,方式与我如何使用SQL搜索满足多个条件的条目类似。
我已经看到我可以使用KeyRange的一个条件搜索IndexedDB。但是,我似乎无法找到任何方法来搜索两列或更多列数据,而无需从数据库中获取所有数据并使用for循环执行此操作。
我知道这是一个新功能,几乎没有在浏览器中实现,但我有一个项目,我正在开始,我正在研究我可以做的不同方式。
谢谢!
答案 0 :(得分:29)
查看this answer相同的问题。它比我在这里给出的答案更详细。 store.createIndex和IDBKeyRange方法can be an array的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]));
答案 1 :(得分:3)
假设您的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的库。 Click here了解有关 JsStore
的更多信息答案 2 :(得分:1)
是的,在索引上打开连续键范围几乎与indexedDB相同。在IndexedDB中无法测试多个条件。它必须在游标循环上完成。
如果您找到解决方案,请告诉我。
BTW,我认为循环游标可能非常快,并且需要比Sqlite更少的内存。答案 3 :(得分:1)
我已经迟了几年了,但是我想指出Josh的答案是假设条件中的所有“列”都是索引keyPath
的一部分。< / p>
如果索引的keyPath
之外存在任何所述“列”,则必须在示例中创建的光标迭代的每个条目上测试涉及它们的条件。因此,如果您正在处理此类查询,或者您的索引不是unique
,请准备编写一些迭代代码!
在任何情况下,如果您可以将查询表示为布尔表达式,我建议您查看BakedGoods。
对于这些类型的操作,除非你执行严格的相等查询(x ===? y
,给定x是objectStore或索引键),否则它将始终在焦点对象库上打开游标,但它会为你节省编写自己的游标迭代代码时出现问题:
bakedGoods.getAll({
filter: "keyObj > 5 && valueObj.someProperty !== 'someValue'",
storageTypes: ["indexedDB"],
complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});
为了完全透明,BakedGoods由 moi 维护。
答案 4 :(得分:0)
我在回答这个问题时提到了一些查询关系的建议,这可能是有意义的:
Conceptual problems with IndexedDB (relationships etc.)
对于一次查询多个字段,看起来在IndexedDB中看起来没有本地方法(我可能是错的;我还是新手),但你当然可以创建一个辅助函数为每个字段使用单独的游标,并对它们进行迭代以查看哪些记录符合所有条件。