IndexedDB:如何使用索引(OR)实现条件

时间:2013-09-16 16:49:34

标签: jquery html5 cursor indexeddb

我正在为我的移动应用程序使用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);
    };  

2 个答案:

答案 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');

请注意,我们认为所有游标都是按主键排序的。因此结果按主键排序。如果我们想要按其他索引排序,我们需要使用复合键。

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