Как полностью исправить SQLite "нет такой ошибки таблицы" на Android 9.0 в обновлении - PullRequest
0 голосов
/ 17 января 2019

Я также встречал ошибку sqlite "no such table" на Android 9.0, я обнаружил, что есть аналогичная проблема на SO. ( Android P - «SQLite: Нет такой ошибки таблицы» после копирования базы данных из ресурсов ).

Основываясь на вышеуказанной ссылке, я попробовал следующие решения 1 и 2.
1) Закрыть соединение после прочтения

private void createDataBase() throws IOException {
    this.getReadableDatabase();
    this.close(); 
    try {           
        copyDataBase();            
    } catch (IOException e) {           
       throw new RuntimeException(e);
    }
}

2) Отключить WAL.

@Override
public void onConfigure(SQLiteDatabase db) {
    Logger.i(TAG, "onConfigure()");
    super.onConfigure(db);
    db.disableWriteAheadLogging();
}

private boolean checkIfDBExists() {
    File dbFile = new File(DB_PATH + DB_NAME);
    return dbFile.exists();
}

public void openDataBase() throws SQLException {
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);

}

После этого я обнаружил проблему. Эти решения хороши только тогда, когда я удаляю установленное приложение и заново устанавливаю приложение.

Когда я установил приложение с ошибкой с "no such table error" на устройстве Android 9.0 , я добавляю исправленный выше код и устанавливаю его непосредственно в Android Studio, которая выглядит как приложение upgrade сценарий.

В этом случае файл БД будет там, checkIfDBExists() вернет истину, затем мы будем называть openDataBase() вместо createDataBase() Все равно будет sqlite "no such table" error, так как я могу полностью решить эту проблему независимо от новой установки или обновления? Заранее спасибо.

1 Ответ

0 голосов
/ 21 января 2019

После нескольких попыток я нашел решение, чтобы решить эту проблему. В папке баз данных есть некоторые временные файлы xxx.db-shm, xxx.db-wal. Эти файлы должны генерироваться при включении WAL, поэтому даже после того, как мы отключим WAL позже, они уже существуют, что повлияет на запрос db.

So the solution is simple, delete these files when you disable WAL.

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