13

Android で SQLite データベースを作成するときに、データベース ロケールを設定しました - db.setLocale(new Locale("cz_CZ"))。これはチェコのロケールです。

SELECT ステートメントが機能し、ロケールが考慮されます。次に例を示します。

SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED 

エントリ「ščťžý」が見つかります。

しかし、LIKE を使用すると失敗します。

SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED 

行は返されません。

ところで。Android には java.text.Normalized クラスはありません。検索に使用される特殊文字を取り除いた正規化されたテキストで2番目の列を作成できると思いましたが、クラスまたは文字列を正規化する方法がありません。

4

5 に答える 5

7

LIKE の SQLite ドキュメントをご覧になりましたか? 非ASCII文字とバグに関する情報が来ました。Android に古いバージョンの SQLite がインストールされている可能性があります。

残念ながら、正規化された 2 番目の列が最良の選択肢になると思います。

于 2010-08-13T23:37:06.503 に答える
2

ちょうど今日、私はあなたとまったく同じ仕事をしていました。私の状況では、複数の列を検索する必要があるため、追加のシャドウ列を作成することはできません。だから私は実際のプロジェクトでテストされているこのようなソリューションに来ました。私の場合、小文字のみを扱っていますが、大文字でも機能を拡張できます。

db.setLocale(Locale("cz", "CZ"))
val query = "SELECT * FROM table WHERE name GLOB ${getExpr(str)} ORDER BY name COLLATE LOCALIZED ASC"

private fun getExpr(input: String) : String{
    var expr = ""
    for(lettter in input){
        expr += when(lettter){
            's','š' -> "[sš]"
            'a','á' -> "[aá]"
            'e','ě','é' -> "[eěé]"
            'i','í' -> "[ií]"
            'z','ž' -> "[zž]"
            'c','č' -> "[cč]"
            'y','ý' -> "[yý]"
            'r','ř' -> "[rř]"
            'u','ů','ú' -> "[uůú]"
            'o','ó' -> "[oó]"
            'n','ň' -> "[nň]"
            'd','ď' -> "[dď]"
            't','ť' -> "[tť]"
            else -> lettter
        }
     }
     return "'*${expr}*'"
}
于 2018-11-29T09:14:13.710 に答える
0

時間がかかるかもしれませんが、ここのように java.text.Normalizer を使用できます

記号、アクセント文字を英語のアルファベットに変換する

Android の Java サブセットの一部ではないため、Normalizer.javaなどの Java のコードで検索してみてください 。Javadoc は次の場所にあります

そして、プロジェクト内で必要なコードの一部をコピーします。

それがうまくいくことを願っています!

于 2012-05-04T09:22:08.750 に答える