0

私はAndroidにSqlite3データベースを持っています。データは「こんにちは」または「良い一日を」のような文です。今、検索ボックスが必要で、それらの間を検索したいので、次のようなものを使用します:

 Cursor cursor = sqliteDB.rawQuery("SELECT id FROM category WHERE sentences LIKE '"+ s.toString().toLowerCase()+ "%' LIMIT 10", null);

ただし、ユーザーが最初の「g」または「go」または「goo」などで検索を開始した場合、結果として「こんにちは」のみが表示されます。ユーザーが「a」または「」のように検索した場合、結果として「こんにちは」を取得するにはどうすればよいですかaf」または「午後」。

ユーザーが最初から検索した場合だけでなく、ユーザーが sqlite3 db のデータの途中から検索した場合に、「こんにちは」の結果を表示したいということです。

ありがとう!

4

1 に答える 1

2

クエリ文字列の前にパーセント記号を付けるだけです: LIKE '%afternoon%'. ただし、このアプローチには 2 つの欠点があります。

  1. フィルタリングされていないユーザー入力を SQL クエリ文字列に挿入するだけなので、SQL インジェクション攻撃を受けやすくなります。次のようにクエリを書き直して、代わりにクエリ パラメータ構文を使用します SELECT id FROM category WHERE sentences LIKE ? LIMIT 10。ユーザー入力文字列を選択引数としてクエリ メソッド呼び出しに追加します。

  2. LIKEクエリは迅速な文字列の照合と検索に最適化されていないため、データベースが大きくなるにつれて処理速度が大幅に低下します。

番号 2 を解決するには、テキスト関連の検索を大幅に高速化する SQLite のFTS3 拡張機能を使用する必要があります。代わりに、別のクエリ構文を使用LIKEする演算子を使用します。MATCH

SELECT id FROM category WHERE sentences MATCH 'afternoon' LIMIT 10

ご覧のとおり、MATCH演算子にはパーセント記号は必要ありません。sentences検索されているテキスト全体(あなたの場合は列)で単語の出現を見つけようとします。リンク先の FTS3 のドキュメントを読んでください。MATCH クエリ構文は、次のような初期の検索エンジン クエリ構文とよく似た、データベース テーブル内のテキストを検索するためのより便利で強力なオプションを提供します。

MATCH 'afternoon OR evening'

FTS3 拡張機能の唯一の (マイナーな) 欠点は、追加の検索インデックス テーブルとメタデータが作成されるため、データベース ファイルのサイズが大きくなることです。しかし、このユースケースではそれだけの価値があると思います。

于 2013-11-08T22:49:25.710 に答える