为什么以及在哪里调用setLocale

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

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

我已经开发了开发人员指南中的SQLite部分,以及在SO和Google中搜索过的SQLiteOpenHelperSQLiteDatabase的javadocs,但我无处可找到将语言环境设置到数据库的正确位置,或者是否真的是必要的。 猜测它应该在DB创建时完成,我尝试在helper的onCreate方法中调用db.setLocale ,但是我得到了这个exception:

 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

  1. 只有在打算使用LOCALIZED排序规则算法时才需要设置语言环境,这取决于系统区域设置,
  2. 如您的答案中所述,在onConfigure()上调用setLocale() onConfigure()

好的,我在SQLiteOpenHelper文档中找到了以下方法:

void onConfigure(SQLiteDatabase db)

复制方法说明:

在配置数据库连接时调用,以启用预写日志记录或外键支持等function。 在调用onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int),onDowngrade(SQLiteDatabase,int,int)或onOpen(SQLiteDatabase)之前调用此方法。 除了根据需要配置数据库连接之外,它不应修改数据库。 此方法应仅调用配置数据库连接参数的方法,例如enableWriteAheadLogging()setForeignKeyConstraintsEnabled(boolean),setLocale(Locale),setMaximumSize(long)或执行PRAGMA语句。

当助手第一次创建数据库时,会调用此方法。 我检查了db文件, android_metadata现在包含正确的语言环境。 我已经运行了一些测试来存储重音字符,即使没有设置正确的语言环境,它们也能正确写入数据库。