2

我需要为我的应用程序创建一个 SQLite 数据库。我需要存储几种欧洲语言的文本,所以会有很多重音字符和其他奇怪的标记。我在扩展SQLiteOpenHelper

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

我已经阅读了开发人员指南中的 SQLite 部分,以及在 SO 和 Google 中搜索的和的 javadocs SQLiteOpenHelperSQLiteDatabase但我找不到将语言环境设置为 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. 我真的需要将语言环境设置为数据库吗?我真的不需要开箱即用地对查询进行排序,因为我以后总是可以自己对结果进行排序。
  2. 我应该在哪里打电话setLocale
4

2 回答 2

1
  1. 仅当您打算使用LOCALIZED排序算法时才需要设置语言环境,这取决于系统语言环境,
  2. 如您的回答中所述,请致电setLocale()onConfigure()
于 2012-12-05T10:50:54.430 回答
0

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

无效 onConfigure(SQLiteDatabase 数据库)

从方法描述中复制:

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

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

于 2012-12-05T10:27:48.203 回答