and*_*ast 6 sqlite mobile android checkpoint
我正在尝试创建 sqlite 数据库的备份,并且想首先刷新数据库中 WAL 文件的内容。
这是我的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的理解是,检查点完成后,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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但似乎没有做任何事情。运行此命令后,我实际检查了 mydb.db-wal 文件并具有相同的大小。我还检查了设备上的数据库,数据库中没有添加任何内容
经过一番挖掘后,我发现了这个[ /sf/answers/2119493981/][1] 并尝试了这个:
2.
public Completable flushWalInDB() {
return Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
getInstance(mContext).getReadableDatabase().execSQL("pragma wal_checkpoint;");
}
});
}
Run Code Online (Sandbox Code Playgroud)
运行此程序时会抛出错误:
unknown error (code 0): Queries can be performed using SQLiteDatabase query or rawQuery methods only.
Run Code Online (Sandbox Code Playgroud)
基于这个答案[ /sf/answers/1370203901/][1],我还尝试对数据库进行VACUUM,但似乎没有发生任何事情。
public Completable vacuumDb() {
return Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
getInstance(mContext).getReadableDatabase().execSQL("VACUUM");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
创建备份之前刷新数据库中的 WAL 文件的正确方法是什么?
谢谢。
PRAGMA wal_checkpoint(2)确实将 WAL 中的所有数据复制到实际的数据库文件中,但它不会删除该-wal文件,并且任何并发连接都可以在之后立即进行新的更改。
如果您想真正确定没有 WAL 干扰您的备份,请运行PRAGMA Journal_mode = DELETE。(之后您可以将其切换回来。)
| 归档时间: |
|
| 查看次数: |
6019 次 |
| 最近记录: |