【问题标题】:Why and Where to call setLocale为什么以及在何处调用 setLocale
【发布时间】:2012-12-05 19:02:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java android sqlite locale


    【解决方案1】:
    1. 仅当您打算使用 LOCALIZED 排序算法时才需要设置区域设置,这取决于系统区域设置,
    2. 如您的回答中所述,请致电setLocale() onConfigure()

    【讨论】:

    • 谢谢。关于#1,sqlite 使用哪种字符编码?大多数 ISO-8859 语言和默认(UTF-8?)排序很可能没有排序差异。
    • SQLite 总是使用 UTF-8。建议使用UNICODE 排序规则,这使得数据库独立于语言环境。
    【解决方案2】:

    好的,我在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 现在包含正确的语言环境。我已经运行了一些测试来存储重音字符,即使没有设置正确的语言环境,它们也可以正确写入数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2011-08-25
      相关资源
      最近更新 更多