我正在为我的移动应用程序使用IndexDB。 95%的工作,但我陷入了一个条件。 如何在INDEXDB中实现SQL的“ OR CONDITION ” 例如:WHERE A =“xyz”或B =“abc”或C =“pqr”
我在谷歌搜索但找不到任何解决方案。可以请一些人指导我如何继续!下面是我的代码,但它适用于以下示例。 例如:WHERE A =“xyz”,B =“abc”,C =“pqr”
var range = IDBKeyRange.only(lowerBound);
var index = objectStore.index(IndexName);
index.openCursor(range).onsuccess = function(event) {
var cursor = event.target.result;
if (cursor)
callback(cursor,db);
};
答案 0 :(得分:1)
您可以进行搜索,但不能使用索引搜索。以下是示例代码:
var transaction = indexedDB.open(dbName);
transaction.onsuccess = function(e) {
var database = e.target.result;
var transaction = database.transaction(storeName, 'readonly');
var objectStore = transaction.objectStore(storeName);
var cursorRequest = objectStore.openCursor();
var items = [];
cursorRequest.onsuccess = function (event)
{
if (event.target.result)
{
if(event.target.result.value["A"] == "xyz" || event.target.result.value["B"] == "abc" || event.target.result.value["C"] == "pqr")
items.push(event.target.result.value);
event.target.result['continue']();
}
};
}
答案 1 :(得分:0)
作为@Rohit的反馈
编辑一个简单的解决方案将查询所有三个游标并在内存中排序合并。但是它不具有可扩展性,无法利用限制。
解决方案是多查询,如google io session next gen query中所述。
基本打开三个游标,然后按最低键值迭代下一步。使用我的开源库ydn-db,它将如下:
var q1 = ydn.db.IndexValueCursors.where('store', 'A', '=', 'abc');
var q2 = ydn.db.IndexValueCursors.where('store', 'B', '=', 'def');
var q3 = ydn.db.IndexValueCursors.where('store', 'C', '=', 'hij');
var result = [];
db.open(function(cursors) {
var lowest_primary_key = ... find from cursors array
if (lowest_primary_key) {
result.push(cursors[lowest_cursor_idx].value);
var cnt_next = [];
cnt_next[lowest_cursor_idx] = true; // continue only lowest cursor
return cnt_next;
}
}, [q1, q2, q3], 'readonly');
请注意,我们认为所有游标都是按主键排序的。因此结果按主键排序。如果我们想要按其他索引排序,我们需要使用复合键。
如果没有库,异步样板代码的实现将非常混乱。但可行和实施非常直接。