4

Phonegapを使用してiOS用の辞書アプリを作成しています。

データベースにアルファベット順のリストを照会するとき、私は以下を使用しますCOLLATE NOCASE

ORDER BY term COLLATE NOCASE ASC

これにより、小文字で始まる用語が末尾に追加されるという問題が解決されました(その質問から選択しました)。

ただし、öäüéêèのような非標準の文字は、最終的にはソートされます〜ここに2つの例:

    Expected: Öffnungszeiten     Oberved: Zuzahlung
              Zuzahlung                   Öffnungszeiten

(or)          clé                         cliquer sur
              cliquer sur                 clé

私は周りを見回して、ここまたはここで議論されている同様の問題を見つけましたが、一般的なアドバイスは、ある種の拡張機能をインストールすることであるようです

この拡張機能はおそらくあなたを助けることができます...

...拡張機能としてICUを使用する

SQLiteはICUとの統合をサポートしています...

しかし、データベースが自分でホストされておらず、顧客のデバイスで実行されている状況にこれが当てはまるかどうかはわかりません。したがって、この拡張機能をアプリパッケージと一緒に出荷すると思います。
私はiOSにあまり精通していませんが、少なくとも複雑になると感じています。

また、公式フォーラムで私はそのヒントを見つけました:

SQLite does not properly handle accented characters.

そして、テキストの少し下に、ポスターはSQLiteのバグについて言及しています。

私が見つけたすべてのリンクは1年以上アクティブでなく、それらのどれも私が現在開発しているモバイル環境を扱っているようです。
それで、誰かが彼らのiOSプロジェクトで解決策を見つけたかどうか疑問に思いました。

ドキュメントには、デフォルトのCOLLATIONオプションは3つだけであると記載されています。

6.0照合シーケンス

SQLiteは2つの文字列を比較するときに、照合シーケンスまたは照合関数(同じものに対して2つの単語)を使用して、どちらの文字列が大きいか、または2つの文字列が等しいかどうかを判断します。SQLiteには、BINARY、NOCASE、およびRTRIMの3つの組み込みの照合機能があります。

BINARY - Compares string data using memcmp(), regardless of text encoding.
NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the

比較が行われます。ASCII文字のみが大文字と小文字が折りたたまれていることに注意してください。SQLiteは、必要なテーブルのサイズが原因で、完全なUTFケースフォールディングを実行しようとしません。RTRIM-末尾のスペース文字が無視されることを除いて、バイナリと同じです。

今のところ、JavaScriptで並べ替えを行うのが最善の推測ですが、これでは全体的なパフォーマンスには何の影響も及ぼさないと思います。

4

1 に答える 1

2

その理由は、iOS上のSQLiteではICU(International Components for Unicode)が有効になっていないためです。したがって、ICUを有効にして独自のSQLiteバージョンを構築し、静的ライブラリとして独自のICUバージョンを構築し、ICU .datを追加して、SQLiteにこの.datファイルをロードさせる必要があります。次に、単純なSQLコマンド(つまり、データベースが開かれた後、'icu_load_collat​​ion( "de_DE"、 "DEUTSCH")'を介して任意の照合をロードできます)

ダートワークのように聞こえるだけでなく、実際にそうです。SQLite+ICUのバージョンを見つけてみてください。すべてがすでに完了しています。

于 2013-09-25T00:00:26.540 に答える