2012-12-05 56 views
2

我需要爲我的應用程序創建一個SQLite數據庫。我需要以幾種歐洲語言存儲文本,所以會有很多重音字符和其他奇怪的標記。我正在延伸SQLiteOpenHelper爲什麼和在哪裏調用setLocale

檢查.db文件我注意到有一個額外的表名爲android_metadata。有一個名爲locale的列,在我的模擬器中默認設置爲「en_US」。

我在開發人員指南中搜索了SQLite部分,還搜索了在SO和Google中搜索到的SQLiteOpenHelperSQLiteDatabase的javadoc,但無處可查找將語言環境設置爲數據庫的正確位置,或者如果它確實是必要的。猜測它應該在的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

回答

1
  1. 僅當您打算使用LOCALIZED排序算法,這取決於系統的區域,那麼你就需要設置語言環境,
  2. 在你的答覆中提到,呼籲onConfigure()setLocale()
+0

謝謝。關於#1,哪個字符編碼是sqlite使用的?大多數情況下,大多數ISO-8859語言和默認(UTF-8?)排序不會有順序差異。 –

+0

SQLite總是使用UTF-8。建議使用'UNICODE'排序規則,這使得數據庫獨立於語言環境。 –

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現在包含正確的語言環境。我已經運行了一些測試來存儲重音字符,並且即使沒有設置正確的語言環境,它們也會正確寫入數據庫。

相關問題