将数据库从资产文件夹复制到应用程序

时间:2011-08-01 13:46:10

标签: java android sqlite

我已经在线阅读了很多关于如何将数据库文件从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);可能上下文传递错误,但我看不清楚。

1 个答案:

答案 0 :(得分:0)

使用常规文件操作复制数据库,而错误消息明确指向sqlite。因此,当您尝试打开非现有数据库时,最有可能发生错误。如果有堆栈跟踪,它将准确显示它发生的位置。

最后,我建议您不要使用类Error,因为它是为VM错误保留的。使用RuntimeException并始终包含根本原因。