无法将SQLiteDatabase编码设置为UTF-8以外的任何其他编码

时间:2013-04-12 19:28:48

标签: android character-encoding android-sqlite

我正在解决一个问题,我需要将一个sqlite数据库附加到另一个。其中一个数据库由我的应用程序创建,另一个数据库是从远程服务器下载的。我更喜欢用合法的数据格式(如JSON)来获取它,但我无法控制这方面。

问题是下载的sqlite文件的编码是UTF-16le。本地文件是UTF-8(Android的默认值)。我可以自己读取这两个文件,但SQLite只允许在编码匹配时进行ATTACH操作。

解决方案应该像创建本地数据库时使用UTF-16le编码一样简单,但似乎在获取数据库对象之前总是设置编码,我无法更改它。我正在使用SQLiteOpenHelper,我假设所有PRAGMA语句都应该在onConfigure()中发生,如下所示:

@Override 
public void onConfigure(SQLiteDatabase db) { 
    db.execSQL("PRAGMA encoding = \"UTF-16le\""); 
}

当我在此点之后检查编码时,它总是UTF-8。

Log.d(TAG, DatabaseUtils.dumpCursorToString(db.rawQuery("PRAGMA encoding", null)));

结果:

04-12 11:10:07.116: D/MainActivity(10743): >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@b3636fd0
04-12 11:10:07.116: D/MainActivity(10743): 0 {
04-12 11:10:07.116: D/MainActivity(10743):    encoding=UTF-8
04-12 11:10:07.116: D/MainActivity(10743): }
04-12 11:10:07.116: D/MainActivity(10743): <<<<<

我甚至尝试在内存中创建数据库并设置其编码,但之后总是会报告UTF-8:

SQLiteDatabase db = SQLiteDatabase.create(null);
db.execSQL("PRAGMA encoding = \"UTF-16le\"");

我有点困惑,因为我可以打开这些UTF-16le编码的数据库并正确报告它们的编码,但我似乎无法在设备上创建一个。在我创建数据库时,有没有办法设置数据库的编码?

2 个答案:

答案 0 :(得分:1)

根据thisthis Android sqlite仅支持UTF-8和UTF-16。

这有帮助吗? 亚龙

答案 1 :(得分:0)

提出了一个kludgy解决方案。 基本上,我的资产文件夹中有一个空白的UTF-16le数据库文件。当我创建一个新数据库时,我将这个文件复制(在我的SQLiteOpenHelper中)并在此之后正常完成所有操作。