iPhoneアプリのテーブルクエリ
-
05-07-2019 - |
質問
テーブルビュー(データベースにリンク)と検索バーがあります。検索バーに何かを入力すると、データベース内で簡単な検索が実行され、入力した結果が表示されます。
クエリは次のようになります。
SELECT * FROM MyTable WHERE name LIKE '%NAME%'
ASCII 文字のみを使用する限り、すべて正常に動作します。私が望むのは、ASCII 文字を入力し、それに相当する文字を発音記号と一致させることです。たとえば、「Alizee」と入力すると、「Alizee」と一致すると期待されます。
クエリをロケールに依存しないようにする方法はありますか?SQL の COLLATE オプションについては注意しましたが、SQLite では役に立たないようです。また、iPhone SDK 3.0 には「ローカライズされた照合順序」があることにも注意しましたが、これが何を意味するのかについてのドキュメントは見つかりませんでした。 。
ありがとう。
解決
これを解決するには、いくつかのオプションがあります。
実行する前に、クエリのすべてのアクセントチャーを置き換えます。
「サイケデリス」 => 「サイケデリス」
"À contre-courant" => "A contre-courant"
「テンペテ」 => 「テンペテ」
等ただし、これは入力に対してのみ機能するため、データベース自体にアクセントを付けたCharsが必要です。シンプルな解決策ですが、完璧とはほど遠いです。
サードパーティのライブラリ、つまり ICU を使用します (以下のリンク)。ただし、それが iPhone にとって最適な選択であるかどうかはわかりません。
比較を行う 1 つ以上のカスタム C 関数を作成します。詳細については以下のリンクをご覧ください。
StackOverflow には、さまざまなオプションについて説明したいくつかの投稿があります。
指定されたロケールでsqlite3でテキストを並べ替える方法は?
SQLite の大文字と小文字を区別しない UTF-8 文字列照合 (C/C++)
Sqlite でアクセント/発音記号を区別しない検索を実装するにはどうすればよいですか?
外部リンクもいくつかあります。
C/C++ での SQLite およびネイティブ UNICODE LIKE のサポート
sqliteの大文字と小文字とアクセントを区別しない検索
他のヒント
SQLについてはわかりませんが、 NSDiacriticInsensitivePredicateOption
を使用して、メモリ内のNSStringを比較できることは間違いないと思います。
例は、検索対象の文字列でいっぱいのNSArrayです。比較オプションとして NSDiacriticInsensitivePredicateOption
を使用し、成功した一致を表示して、文字列を比較する配列を反復処理できます。