Копирование базы данных из папки активов в приложение - PullRequest
0 голосов
/ 01 августа 2011

Я следовал многим онлайн-учебникам о том, как добиться копирования файла БД из папки «assets» в apk в папку «/ data / data // database» приложения.С моим кодом он завершается неудачно при первом его открытии и копировании базы данных.

Как и в учебниках, создается пустая база данных, в которую копируется моя база данных, но, похоже, она не работает длямне.Код точно такой же, как и везде.Но здесь все равно с соответствующими журналами.

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 голосов
/ 01 августа 2011

Вы копируете базу данных, используя обычные файловые операции, в то время как сообщение об ошибке явно ссылается на sqlite.Так что ошибка, скорее всего, возникает при попытке открыть несуществующую базу данных.Если есть трассировка стека, она точно покажет, где это происходит.

Наконец, я рекомендую не использовать класс Error, так как он зарезервирован для ошибок ВМ.Используйте RuntimeException и всегда включайте в него основную причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...