Как вручную выполнить контрольную точку в SQLite android?

Я пытаюсь создать резервную копию моей базы данных sqlite, и я хочу сначала очистить содержимое файла WAL в db.

Вот мой SQLiteOpenHelper:

public class MyDBHelper extends SQLiteOpenHelper {

private Context mContext;
private static MyDBHelper mInstance = null;

private MyDBHelper(final Context context, String databaseName) {
    super(new MYDB(context), databaseName, null, DATABASE_VERSION);
    this.mContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}
   public static MyDBHelper getInstance(Context context) {

    if (mInstance == null) {
        mInstance = new MyDBHelper(context, DATABASE_NAME);
    }
    return mInstance;
}

  private void closeDataBase(Context context) {
    getInstance(context).close();
}

}

Насколько я понимаю, после завершения контрольной точки файл mydb.db-wal должен быть пустым. Это правильно?

Вот что я пробовал до сих пор: 1.

    public Completable flushWalInDB() {
    return Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            getInstance(mContext).getReadableDatabase().rawQuery("pragma wal_checkpoint;", null);
        }
    });
}

Это не вызывает ошибки, но, похоже, ничего не делает. После запуска я физически проверил свой файл mydb.db-wal и получил тот же размер. Я также проверил db на устройстве, и в базу ничего не добавлено

Покопавшись, я нашел это [https://stackoverflow.com/a/30278485/2610933visible[1provided и попробовал это:

2.

    public Completable flushWalInDB() {
    return Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            getInstance(mContext).getReadableDatabase().execSQL("pragma wal_checkpoint;");
        }
    });
}

При запуске выдает ошибку:

unknown error (code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only.

И, основываясь на этом ответе [https://stackoverflow.com/a/19574341/2610933visible[1provided, Я также пытался ВАКУУМИВАТЬ БД, но, похоже, ничего не произошло.

 public Completable vacuumDb() {
    return Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            getInstance(mContext).getReadableDatabase().execSQL("VACUUM");
        }
    });
} 
}

Как правильно очистить файл WAL в БД перед созданием резервной копии?

Спасибо.


person android enthusiast    schedule 26.07.2018    source источник
comment
Что касается вашей первой попытки с rawQuery, вам нужно сделать что-то вроде Cursor.moveToNext (), чтобы он действительно запустился.   -  person Mark    schedule 02.01.2019


Ответы (1)


PRAGMA wal_checkpoint(2) копирует все данные из WAL в фактический файл базы данных, но не удаляет -wal файл, и любые параллельные соединения могут вносить новые изменения сразу после этого.

Если вы действительно хотите быть уверены, что WAL не мешает вашему резервному копированию, запустите PRAGMA journal_mode = УДАЛИТЬ. (После этого вы можете переключить его обратно.)

person CL.    schedule 26.07.2018