2012-02-24 21 views
2

私はAndroidで辞書アプリケーションを作成しようとしています。私は80000の記事のデータベースを持っています。Android SQLite非常に遅い検索

public Cursor query(String entry){ 
      String[] columns = new String[]{"_id", "word"}; 
      String[] selectionArgs = new String[]{entry + "%"}; 
      return mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null); 
    } 

と私はListViewコントロールのためSimpleCursorAdapterを使用します。ユーザーはEditTextに単語を入力すると、私は次のコードを使用することを行うには、リストビューでの提案を示したいと思います。

問題は非常に遅れて表示されることです。私はその理由がSQLでLIKEだと思う。私はそれを行うための他の方法を知らない。提案を取得するパフォーマンスを向上させるためにできることはありますか?

+0

単語フィールドの大きさはどれくらいですか? –

+1

あなたは各記事のためのキーワードと別のテーブルを持って、そこにあなたの検索をする必要があります。それ以外の場合は助けてくれません。 –

+0

@coderdem提示する予定の提案はいくつありますか?それは単純なオートコンプリートな機能になるだろうか?または、_suggestions_結果リストに何千もの検索結果を表示しようとしていますか?後者でない場合は、なぜ_limit_を使用しないのですか? –

答えて

3

word列にインデックスを追加すると、多くの利点が得られる場合があります。 the documentationを参照してください。

だからあなたはあなたがテーブルを作成した直後に、これを試してみてください:

CREATE INDEX word_idx ON word (word); 

(注:私は両方wordという名前のテーブルと列を持つことが、ここで構文の問題が発生するかどうかわからないんだけど、それを試してみて、 !シンプルな代替手段として)

+0

が間違っています。索引は、特に記事などのようなテキストフィールドに無意識のうちに作成すべきではありません。 –

+0

私は列には、単語の名前で示されているように、記事全体ではなく個別の単語が含まれているとします。 –

+0

@GrahamBorlandの単語フィールドは既にソートされています。しかし、それはトルコ文字を含んでいるので、それはトルコ語に従ってソートされます。このことが重要かどうかはわかりません。 – ipman

1

を参照してください、あなたはこの記事のようにLimitと任意の順序での提案を制限することができます。Using the LIMIT statement in a SQLite query

mDB.query("word", columns, "word LIKE ?", selectionArgs, null, null, null, "LIMIT 150"); 

すべての結果が同様に有効な提案であるため、順序は関係ありません。

また、あなたはあなたのUIに応じていくつかの固定数を簡単に使うことができるので、狂った量の提案を表示することはできません。私は例としてを与えました。

はさておき、これは辞書である場合は、MATCHはなくlikeでフルテキスト検索を使用してになります明らかインデックスから

1

...それがお役に立てば幸いです。 AndroidはFTS3をサポートする必要があります。

http://www.sqlite.org/fts3.htmlをチェックし、Androidのfts3についてはここでいくつかの回答を確認してください。

単語は文字列で始まるようです。 多分このタイプのトリックが助けになるかもしれません:SQLite FTS3 simulate LIKE somestring%

+0

私はFTS3について聞いたことがない。私はそれをチェックします。 – ipman

+0

フルテキスト検索です。通常、データベース内の高速文字列検索には全文検索を使用します。 –