伙计们,在将数据库从本地资产文件夹复制到/data/data/package_name/databases目录时,我遇到了问题。当我使用http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/教程来做这件事时,我只能得到一个空文件。
我引用了copyDataBase()方法的一部分,没有区别。每次应用程序启动时,它都会创建目录和空数据库。那么有没有办法让copyDataBase()起作用呢?
非常感谢!
发布于 2011-06-30 20:59:00
为什么你不从资产中复制?这样做是非常正常的。但您不能在onCreate中执行此操作,此时已经创建了一个空数据库。你需要事先做好。我通常在getWriteableDatabase的重写中这样做,比如
public synchronized SQLiteDatabase getWritableDatabase() {
SQLiteDatabase db = null;
if (!doesDatabaseExist()) {
try {
copyDatabase();
db = super.getWritableDatabase();
} catch(Exception ex) {
Log.e("Database Log", getDatabasePath() + " failed to copy correctly. " + ex.getLocalizedMessage());
}
}
else {
db = super.getWritableDatabase();
}
return db;
}
发布于 2013-07-20 23:44:44
我不知道它是否仍然有用,但这里是其他人看到awnser的解决方案。您使用的代码适用于大多数手机,一些较旧的手机在getReadableDatabase()函数中有不同的行为。因此,您的问题不在于copyDataBase函数,而在于createDataBase函数。
在createDataBase()中,有以下检查;
this.getReadableDatabase();
这将检查是否已经存在具有所提供名称的数据库,如果没有,则创建一个空数据库,以便可以用assets文件夹中的数据库覆盖该数据库。在较新的设备上,这可以完美地工作,但也有一些设备不能工作。主要是较旧的设备。我不知道确切的原因,但似乎getReadableDatabase()函数不仅获取数据库,而且还打开它。如果您随后将数据库从assets文件夹复制到它上面,它仍然具有指向空数据库的指针,并且您将得到table does exist错误。
因此,为了使它在所有设备上都能工作,您应该将其修改为以下几行:
SQLiteDatabase db = this.getReadableDatabase();
if (db.isOpen()){
db.close();
}
即使在检查中打开了数据库,之后它也会关闭,不会再给您带来任何麻烦。
发布于 2012-07-21 17:40:26
在上面的示例中,我是这样工作的:
db = super.getWritableDatabase();
db.close;
copyDatabase();
否则我会得到一个IO错误;
https://stackoverflow.com/questions/6120424
复制