我的应用程序的数据库需要填充大量数据,所以在onCreate()期间,不仅仅是一些create table sql指令,还有很多插入操作。我选择的解决方案是将所有这些指令存储在res/raw中的一个sql文件中,该文件由Resources.openRawResource(id)加载。
它工作得很好,但我面临着编码问题,我在sql文件中有一些突出的字符,这在我的应用程序中看起来很糟糕。下面是我做这件事的代码:
public String getFileContent(Resources resources, int rawId) throws
IOException
{
InputStream is = resources.openRawResource(rawId);
int size = is.available();
// Read the entire asset into a local byte buffer.
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
// Convert the buffer into a string.
return new String(buffer);
}
public void onCreate(SQLiteDatabase db) {
try {
// get file content
String sqlCode = getFileContent(mCtx.getResources(), R.raw.db_create);
// execute code
for (String sqlStatements : sqlCode.split(";"))
{
db.execSQL(sqlStatements);
}
Log.v("Creating database done.");
} catch (IOException e) {
// Should never happen!
Log.e("Error reading sql file " + e.getMessage(), e);
throw new RuntimeException(e);
} catch (SQLException e) {
Log.e("Error executing sql code " + e.getMessage(), e);
throw new RuntimeException(e);
}我发现避免这种情况的解决方案是从一个巨大的static final String而不是一个文件中加载sql指令,并且所有突出显示的字符看起来都很好。
但是,有没有比包含所有sql指令的大型static final String属性更优雅的加载sql指令的方法呢?
发布于 2009-12-24 00:37:25
我想你的问题出在这行:
return new String(buffer);您正在将字节数组转换为java.lang.String,但是您没有告诉Java/Android要使用的编码。因此,重音字符的字节没有正确转换,因为使用了错误的编码。
如果使用[String(byte[],<encoding>)](http://developer.android.com/reference/java/lang/String.html#String(byte[],%20java.lang.String%29)构造函数,则可以指定文件的编码,字符将被正确转换。
发布于 2009-12-24 00:36:24
SQL文件解决方案看起来很完美,只是你需要确保文件是以utf8编码保存的,否则所有突出显示的字符都会丢失。如果您不想更改文件的编码,那么需要向新的String(bytes, charset)传递一个额外的参数来定义文件的编码。
最好使用文件资源,而不是静态的最终字符串,以避免将所有不必要的字节加载到内存中。在手机中,你想尽可能节省所有的内存!
发布于 2012-03-19 08:55:32
我使用了一种不同的方法:我在桌面上构建我的sqlite数据库,将其放在assets文件夹中,在android中创建一个空的sqlite db,然后将该db从assets文件夹复制到数据库文件夹中,而不是执行sql语句的加载(这将需要很长时间才能完成)。这是一个巨大的速度提升。注意,您需要先在android中创建一个空数据库,然后才能复制和覆盖它。否则,Android将不允许您在数据库文件夹中写入数据库。在互联网上有几个例子。顺便说一句,如果数据库没有文件扩展名,这种方法似乎工作得最好。
https://stackoverflow.com/questions/1953823
复制相似问题