2

アプリケーション用に SQLite DB を作成する必要があります。いくつかのヨーロッパ言語でテキストを保存する必要があるため、アクセント付きの文字やその他の奇妙なマークがたくさんあります。延長していSQLiteOpenHelperます。

.db ファイルを調べると、 という名前の余分なテーブルがあることに気付きましたandroid_metadata。という名前の単一の列がありlocale、シミュレーターではデフォルトで「en_US」に設定されています。

SQLiteOpenHelper開発者ガイドの SQLite セクションと、およびの Javadoc を読んだSQLiteDatabaseことがありますが、SO と Google で検索しましたが、ロケールを DB に設定する正しい場所がどこにあるか、または本当に必要な場合はどこにも見つかりませんでした. DBの作成時に行うべきだと推測してdb.setLocale、ヘルパーのonCreateメソッドを呼び出してみましたが、次の例外が発生しています:

BEGIN TRANSACTION failed setting locale
FATAL EXCEPTION: Thread-9
android.database.sqlite.SQLiteException: cannot start a transaction within a transaction
at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)

これは私の方法がどのように見えるかです:

public class MyOpenHelper extends SQLiteOpenHelper {

    @Override
    public void onCreate(SQLiteDatabase db) {   
        db.setLocale(new Locale("en","EN"));
        ...
    }

    ...
}

そして、ここに私の質問があります:

  1. ロケールを DB に設定する必要は本当にありますか? 後でいつでも自分で結果を並べ替えることができるので、クエリをすぐに並べ替える必要はありません。
  2. どこに電話すればいいsetLocaleですか?
4

2 に答える 2

1
  1. LOCALIZEDシステムロケールに依存する照合アルゴリズムを使用する場合にのみ、ロケールを設定する必要があります。
  2. あなたの答えで述べたように、電話setLocale()してくださいonConfigure()
于 2012-12-05T10:50:54.430 に答える
0

わかりました、私はSQLiteOpenHelperドキュメントで次の方法を見つけました:

void onConfigure(SQLiteDatabase db)

メソッドの説明からコピー:

データベース接続が構成されているときに呼び出され、先行書き込みロギングや外部キーサポートなどの機能を有効にします。このメソッドは、onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int)、onDowngrade(SQLiteDatabase、int、int)、またはonOpen(SQLiteDatabase)が呼び出される前に呼び出されます。必要に応じてデータベース接続を構成する場合を除いて、データベースを変更しないでください。このメソッドは、enableWriteAheadLogging()setForeignKeyConstraintsEnabled(boolean)、setLocale(Locale)、setMaximumSize(long)、またはPRAGMAステートメントの実行など、データベース接続のパラメーターを構成するメソッドのみを呼び出す必要があります。

このメソッドは、ヘルパーが初めてDBを作成するときに呼び出されます。dbファイルを確認しましたandroid_metadataが、正しいロケールが含まれています。アクセント付きの文字を保存するためにいくつかのテストを実行しましたが、適切なロケールを設定しなくても、それらはデータベースに正しく書き込まれます。

于 2012-12-05T10:27:48.203 に答える