为什么以及在哪里调用setLocale

时间:2012-12-05 09:37:35

标签: java android sqlite locale

我需要为我的应用程序创建一个SQLite DB。我需要以几种欧洲语言存储文本,因此会有大量的重音字符和其他奇怪的标记。我正在延长SQLiteOpenHelper

检查.db文件我注意到有一个名为android_metadata的额外表。有一个名为locale的列,默认情况下在我的模拟器中设置为“en_US”。

我已经阅读了开发人员指南中的SQLite部分,以及SQLiteOpenHelperSQLiteDatabase的javadocs,在SO和Google中搜索过,但我无处可寻找到正确的位置将语言环境设置为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

2 个答案:

答案 0 :(得分:1)

  1. 只有在打算使用LOCALIZED归类算法时,才需要设置语言环境,这取决于系统区域设置,
  2. 如您的回答所述,请致电onConfigure()上的setLocale()

答案 1 :(得分: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文件,android_metadata现在包含正确的语言环境。我已经运行了一些测试来存储重音字符,即使没有设置正确的语言环境,它们也能正确写入数据库。