2013-06-28 2 views
0

Мой текущий код вызывает крах приложения после обновления базы данных из активов (я получаю базу данных с ошибкой). Я знаю, где проблема (потому что изменение схемы таблицы), и мне нужно SELECT * и сбрасывать в новую базу данных, сначала сохраняя в временном расположении, но на самом деле не знаю, как это реализовать. Не могли бы вы помочь мне с кодом?SQlite Database onUpdate crashes

В настоящее время это:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    try { 
    copyDatabase(); 
    } catch (IOException e) { 
    throw new Error("Error copying database" + e.toString()); 
    } 
} 

public 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 byte to inputfile to 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(); 
} 

КСТАТИ App сбой при первом запуске приложения, когда я открываю его снова Everthing работает отлично. Проблема также не возникает, если пользователь загружает новейшую версию без предыдущей версии.

Logcat:

06-28 17:11:54.456: E/SQLiteLog(25926): (11) database corruption at line 50987 of  [00bb9c9ce4] 
06-28 17:11:54.456: E/SQLiteLog(25926): (11) statement aborts at 4: [select count(*) from Numerical] 
06-28 17:11:54.456: E/DefaultDatabaseErrorHandler(25926): Corruption reported by sqlite on database: /data/data/com.xxx.yyy/databases/database.db 
06-28 17:11:54.456: E/DefaultDatabaseErrorHandler(25926): deleting the database file: /data/data/com.xxx.yyy/databases/database.db 
06-28 17:11:54.456: E/AndroidRuntime(25926): FATAL EXCEPTION: main 
06-28 17:11:54.456: E/AndroidRuntime(25926): java.lang.RuntimeException: Unable to start activity    ComponentInfo{com.xxx.yyy/com.xxx.yyy.PuzzleActivity}:  android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed (code 11) 
+0

Не могли бы вы разместить logcat? – jkau

+0

уверен. это уже есть –

ответ

0

Если вы уверены, что этот код правильно, то попробуйте изменить DATABASE_VERSION = 1; к DATABASE_VERSION = 2;, если бы не сделать это , а также попробовать это:

@Override 
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) { 
+0

спасибо, я делаю точно так же, как и выше .. проблема в том, что когда я изменяю схему таблицы базы данных, при сбоях кода. –

+0

Я думаю, что если вы, но ваш оригинальный код logcat whin it crash, он поможет мне и другим помочь вам – H4F

+0

также есть «ошибка записи» в моем ответе, пожалуйста, еще раз, пожалуйста, – H4F

0

Когда вы вызываете copyDatabase() из метода onUpgrade, вы фактически переопределяете существующий файл базы данных. Проблема заключается в том, что метод onUpgrade вызывается, когда база данных открыта, а ее модификация вызывает исключение позже.

Решение может состоять в том, чтобы установить флаг в onUpgrade (например, shouldUpgradeDatabaseFile = true) и выполнить фактическую операцию копирования снаружи (например, в getWritableDatabase() или getReadableDatabase()).