Резервное копирование базы данных sqlite в режиме WAL без FileStreams // с помощью команд экспорта / резервного копирования sql - PullRequest
1 голос
/ 29 марта 2019

Я искал много ответов здесь, но все используют FileInputStream и FileOutputStream для резервного копирования базы данных.

Ошибка копирования файла в тот момент, когда вы используете PRAGMA операторы с journal_mode=WAL(запись с опережением записи), асинхронный режим и т. д.

Как выполнить резервное копирование / экспорт / снимок базы данных sqlite, работающей в режиме WAL на Android?

Копировать файл можноэто не правильный путь.В sqlite должна быть доступна какая-то команда резервного копирования / экспорта (ну, доступна через командную оболочку sqlite).

Пока что я не нашел решения.Любая помощь с благодарностью.

1 Ответ

1 голос
/ 29 марта 2019

Ошибка копирования файла в тот момент, когда вы используете операторы PRAGMA с journal_mode = WAL (запись с опережением записи), асинхронный режим и т. д.

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

Вот более полный ответ .

Это пример метода, который проверяет базу данных, если она находится в режиме WAL (используется, когда режим журнала может быть либо по умолчанию Android): -

private void checkpointIfWALEnabled(Context context) {
    final String TAG = "WALCHKPNT";
    Cursor csr;
    int wal_busy = -99, wal_log = -99, wal_checkpointed = -99;
    SQLiteDatabase db = SQLiteDatabase.openDatabase(context.getDatabasePath(DBConstants.DATABASE_NAME).getPath(),null,SQLiteDatabase.OPEN_READWRITE);
    csr = db.rawQuery("PRAGMA journal_mode",null);
    if (csr.moveToFirst()) {
        String mode = csr.getString(0);
        //Log.d(TAG, "Mode is " + mode);
        if (mode.toLowerCase().equals("wal")) {
            csr = db.rawQuery("PRAGMA wal_checkpoint",null);
            if (csr.moveToFirst()) {
                wal_busy = csr.getInt(0);
                wal_log = csr.getInt(1);
                wal_checkpointed = csr.getInt(2);
            }
            //Log.d(TAG,"Checkpoint pre checkpointing Busy = " + String.valueOf(wal_busy) + " LOG = " + String.valueOf(wal_log) + " CHECKPOINTED = " + String.valueOf(wal_checkpointed) );
            csr = db.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)",null);
            csr.getCount();
            csr = db.rawQuery("PRAGMA wal_checkpoint",null);
            if (csr.moveToFirst()) {
                wal_busy = csr.getInt(0);
                wal_log = csr.getInt(1);
                wal_checkpointed = csr.getInt(2);
            }
            //Log.d(TAG,"Checkpoint post checkpointing Busy = " + String.valueOf(wal_busy) + " LOG = " + String.valueOf(wal_log) + " CHECKPOINTED = " + String.valueOf(wal_checkpointed) );
        }
    }
    csr.close();
    db.close();
}
  • Обратите внимание, что в приведенном выше имени имя базы данных получено (разрешено) через константу DBConstants.DATABSENAME, это было бы простым изменением подписи, позволяющим передать имя базы данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...