2

我正在为我的移动应用程序使用 IndexDB。95%的工作,但我被困在一种情况。如何在 INDEXDB 中实现 SQL 的 “ OR CONDITION ”,例如:WHERE A="xyz" or B="abc" or 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);
    };  
4

2 回答 2

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']();
        }
    };
}
于 2013-09-20T12:17:24.357 回答
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');

请注意,我们正在利用所有游标都按主键排序的事实。因此结果按主键排序。如果我们想按其他索引排序,我们需要使用复合键来代替。

如果没有该库,异步样板代码的实现将非常混乱。但可行和实施非常简单。

于 2013-09-17T01:28:06.307 回答