我已经在线阅读了很多关于如何将数据库文件从apk中的“assets”文件夹复制到应用程序的“/ data / data // databases”文件夹的教程。使用我的代码,它在第一次打开并复制数据库时失败。
就像教程说它创建了一个空数据库,我的数据库被复制到其中,但它似乎对我不起作用。代码与其他地方完全相同。但无论如何它都适用于相应的日志。
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if(dbExist){
//do nothing - database already exist
Log.v("DBHandler", "Database does exist");
}else{
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
Log.v("DBHandler", "Database does not exist");
db_Read = this.getReadableDatabase();
db_Read.close();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("error copying database"); //Error gets thrown here
}
}
}
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
我在日志中收到以下错误:
08-01 14:34:25.046: ERROR/Database(27530): sqlite3_open_v2("/data/data/com.package/databases/DB.sqlite", &handle, 1, NULL) failed
我很确定错误在于复制数据库。如果需要更多信息,我很乐意提供。
编辑:我确定错误在于复制数据库,所有路径目录都是正确的。我认为它与行有关:InputStream myInput = myContext.getAssets().open(DB_NAME);
可能上下文传递错误,但我看不清楚。
答案 0 :(得分:0)
使用常规文件操作复制数据库,而错误消息明确指向sqlite
。因此,当您尝试打开非现有数据库时,最有可能发生错误。如果有堆栈跟踪,它将准确显示它发生的位置。
最后,我建议您不要使用类Error
,因为它是为VM错误保留的。使用RuntimeException
并始终包含根本原因。