【问题标题】:IndexedDB: How to implement conditions using Index(OR)IndexedDB:如何使用 Index(OR) 实现条件
【发布时间】:2013-09-16 16:49:34
【问题描述】:

我将 IndexDB 用于我的移动应用程序。 95%的工作,但我被困在一种情况。 如何在 INDEXDB 中实现 SQL 的“OR CONDITION例如:WHERE A="xyz" 或 B="abc" 或 C="pqr"

我在谷歌上搜索但找不到任何解决方案。请有人指导我如何继续!以下是我的代码,但它适用于以下示例。 例如:WHERE A="xyz" and B="abc" and 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);
    };  

【问题讨论】:

    标签: jquery html cursor indexeddb


    【解决方案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']();
            }
        };
    }
    

    【讨论】:

      【解决方案2】:

      编辑为来自@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');
      

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

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

      【讨论】:

      • 我相信你所说的是 WHERE A ='abc' 或 A='def' 或更合适的 WHERE A in ('abc','def','hij') 但我想要的是 WHERE A="xyz" 或 B="abc" 或 C="pqr"
      • 抱歉,我滑倒了。基本上它们是相同的,因为我们只关心主键。
      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2012-03-29
      • 2012-06-04
      相关资源
      最近更新 更多