2

モバイル アプリケーションに IndexDB を使用しています。95% 動作していますが、1 つの状態で立ち往生しています。INDEXDB で SQL の " OR CONDITION "を実装するにはどうすればよいですか?例: WHERE A="xyz" または B="abc" または C="pqr"

Googleで検索しましたが、解決策が見つかりませんでした。続行する方法を教えてください。以下は私のコードですが、それは以下の例です。 例: 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からのフィードバックとして編集

簡単な解決策は、3 つのカーソルすべてをクエリし、メモリ内で並べ替えてマージすることです。ただし、スケーラブルではなく、制限を利用できませんでした。

ソリューションは、google io session next gen queryで説明されているマルチクエリです。

基本的に 3 つのカーソルを開き、最も低いキー値で次のステップを繰り返します。私のオープン ソース ライブラリ 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 に答える