gpt4 book ai didi

android - 如何在 SQLite android 中手动执行检查点?

转载 作者:太空狗 更新时间:2023-10-29 13:03:45 24 4
gpt4 key购买 nike

我正在尝试创建我的 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();
}

}

现在,我的理解是检查点完成后,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 文件并且大小相同。我还检查了设备上的数据库,数据库中没有添加任何内容

经过一番挖掘,我发现了这个[ https://stackoverflow.com/a/30278485/2610933][1]并试过这个:

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/2610933][1] ,我也尝试对数据库进行 VACUUM,但似乎没有任何反应。

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

在创建备份之前刷新数据库中的 WAL 文件的正确方法是什么?

谢谢。

最佳答案

PRAGMA wal_checkpoint(2) 确实将 WAL 中的所有数据复制到实际的数据库文件中,但它不会删除 -wal 文件,并且任何并发连接都可以之后立即进行新更改。

如果您想真正确定没有 WAL 干扰您的备份,请运行 PRAGMA journal_mode = DELETE . (之后您可以将其切换回来。)

关于android - 如何在 SQLite android 中手动执行检查点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51535178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com