2016-05-26 1 views
1

から選択ステートメントに基づいてFTS3/4表を使用して、私は、Androidで開発しています、私はこれらの分野で、Sqliteを表に取引と呼ばれるがあります。私のアプリでは通常のテーブル

_Id | Date | Value | Notes 

私が既に持っています(例えば)日付によるフィルタリング結果を示すリストビュー:

Select * FROM Transacions WHERE Date BETWEEN '2016-04-25' AND '2016-05-14'

は、それが正常に動作しますが、私はカスタムの日付の間の取引を検索するSearchViewを実装したいフィールドを持っています注釈、SearchViewで入力したテキスト。 SearchViewを追加する方法については、FTS3またはFTS4テーブルを使用して「SUPERMARKET」と入力し、Notesがこのテキストを持つトランザクションを見つけることができます。 FTSテーブルは(日付をフィルタリングするために、上記のように)WHERE条件を実行するために遅いので 問題は、私はのパフォーマンスでWHERE date BETWEEN ... and ...を使用して、フィルタリング日付の両方を実装し、フィルタリングテキストメモすることができますどのように...

を表示されますFTSテーブル?

  • それはそうすることができない場合、このようなクエリを持っているのは良いアイデアです:

Select * FROM Transacions WHERE (Date BETWEEN '2016-04-25' AND '2016-05-14) AND Notes LIKE '%text%''

+1

"このようなクエリを持つことをお勧めします" - それは非常に遅くなります。私はまだこのシナリオで遊んでいないが、袖口を外して、結合またはサブ選択が最良の選択肢かもしれない。 – CommonsWare

答えて

1

FTSテーブルをテーブルとして考えるのではなく、インデックスとして考えてください。このようにインデックスさリアクション

CREATE VIRTUAL TABLE Transactions_FTS USING FTS4(Notes); 

あなたは両方のテーブルのIDが一致していることを確認しなければならないでしょうし、このようなテーブルを組み合わせることができ:

SELECT * 
FROM Transactions 
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14' 
    AND _Id IN (SELECT docid 
       FROM Transactions_FTS 
       WHERE Notes MATCH 'supermarket'); 

またはこれを:

SELECT * 
FROM Transactions 
JOIN Transactions_FTS ON Transactions._Id = Transactions_FTS.docid 
WHERE Date BETWEEN '2016-04-25' AND '2016-05-14' 
    AND Transactions_FTS.Notes MATCH 'supermarket'; 

(使用するストレージの容量を気にする場合は、)

+0

お返事ありがとうございます!実際には、2番目のオプションは私には適しているようですが、私はftsと通常のテーブルで動作するように他のメソッド(更新、挿入など)を変更しなければなりません。私のコードをあまり変更しないために、私は動的にトランザクションでフィルタリングされたデータを持つアクティビティを作成しました。したがって、ユーザーがテキストの検索を開始すると、実際にはfts matchが使用されますが、dateの間にalredy他のテーブルから – tdmsoares

関連する問題