36

私は最近(悲しいことに)WebSQLがHTML5でサポートされなくなり、代わりにIndexedDBが代わりになることを発見しました。

SQLを使用して複数の条件を満たすエントリを検索する方法と同様の方法で、IndexedDBのエントリをクエリまたは検索する方法があるかどうか疑問に思っています。

KeyRangeで1つの条件を使用してIndexedDBを検索できることを確認しました。ただし、データベースからすべてのデータを取得してforループで実行しないと、2列以上のデータを検索する方法が見つからないようです。

これはブラウザにほとんど実装されていない新機能であることは知っていますが、私は開始しているプロジェクトがあり、それを実行できるさまざまな方法を研究しています。

ありがとうございました!

4

5 に答える 5

38

同じ質問に対するこの回答を確認してください。私がここで与える答えよりも詳細です。store.createIndexメソッドとIDBKeyRangeメソッドのkeypathパラメーターは、配列にすることができます。だから、大まかな例:

// In onupgradeneeded
var store = db.createObjectStore('mystore');
store.createIndex('myindex', ['prop1','prop2'], {unique:false});

// In your query section
var transaction = db.transaction('mystore','readonly');
var store = transaction.objectStore('mystore');
var index = store.index('myindex');
// Select only those records where prop1=value1 and prop2=value2
var request = index.openCursor(IDBKeyRange.only([value1, value2]));
// Select the first matching record
var request = index.get(IDBKeyRange.only([value1, value2]));
于 2013-03-24T16:16:55.640 に答える
6

SQLクエリが次のようなものだとしましょう。

SELECT * FROM TableName WHERE Column1 = 'value1' AND Column2 = 'value2'

JsStoreライブラリの同等のクエリ:

var Connection = new JsStore.Instance("YourDbName");
Connection.select({
    From: "YourTableName"
    Where: {
        Column1: 'value1',
        Column2: 'value2'
    },
    OnSuccess:function (results){
        console.log(results);
    },
    OnError:function (error) {
        console.log(error);
    }
});

さて、JsStoreとは何か疑問に思われる方のために、IndexedDBを簡単に照会するためのライブラリであることをお伝えしておきます。JsStoreの詳細については、ここをクリックしてください

于 2017-09-05T07:29:39.190 に答える
1

この質問への回答の中で、関係を照会するためのいくつかの提案に言及します。これは興味深いかもしれません。

IndexedDBの概念上の問題(関係など)

一度に複数のフィールドにクエリを実行することに関しては、IndexedDBにネイティブな方法があるようには見えませんが(間違っている可能性があります。まだ新しいです)、別のヘルパー関数を使用してヘルパー関数を作成することはできます。各フィールドにカーソルを合わせ、それらを繰り返して、どのレコードがすべての基準を満たしているかを確認しました。

于 2012-01-15T03:24:09.213 に答える
1

はい、インデックスで連続キー範囲を開くことは、indexedDBにあることとほぼ同じです。IndexedDBでは複数の条件をテストすることはできません。カーソルループで実行する必要があります。

解決策を見つけたら、私に知らせてください。

ところで、カーソルのループは非常に高速で、Sqliteの場合よりも必要なメモリが少ないと思います。

于 2012-09-03T15:26:23.870 に答える
1

私は数年遅れていますが、Joshの答えは、条件内のすべての「列」がインデックスの一部であるという仮定に基づいていることを指摘したいと思いますkeyPath

上記の「列」のいずれかがインデックスの外に存在する場合keyPathは、例で作成されたカーソルが繰り返す各エントリで、それらに関連する条件をテストする必要があります。したがって、そのようなクエリを処理している場合、またはインデックスが処理されていない場合はunique、反復コードを作成する準備をしてください。

いずれにせよ、クエリをブール式として表すことができる場合は、BakedGoodsを確認することをお勧めします。

これらのタイプの操作では、厳密な等式クエリを実行していない限り、常にフォーカルobjectStoreでカーソルが開きます(x ===? yxがobjectStoreまたはインデックスキーである場合)が、独自のカーソル反復コードを作成する手間を省くことができます。 :

bakedGoods.getAll({
    filter: "keyObj > 5 && valueObj.someProperty !== 'someValue'",
    storageTypes: ["indexedDB"],
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});

完全な透明性のために、BakedGoodsはmoiによって管理されています。

于 2016-07-09T15:51:26.490 に答える