我的问题是如何强制它将数据写入数据库
并在每次更新后删除临时文件?
是的,您可以强制/启动检查点。
关闭数据库/连接应该检查点它,但在资源方面可能代价高昂(因为您必须重新打开它)。
您也可以使用:-
PRAGMA wal_checkpoint(TRUNCATE)
但是,你应该考虑使用
PRAGMA wal_checkpoint
在截断之前和之后查看 WAL 是否繁忙/检查点完成所有操作(如果您采用它,您可能希望修改下面的示例以检查 wal_busy 等值(示例来自 db 备份和数据库反正已经关闭了))。
wal_checkpoint pragma 返回包含三个整数列的单行。第一列通常为 0,但如果 RESTART、FULL 或 TRUNCATE 检查点被阻止完成,则为 1
我建议阅读Write-Ahead Logging 和PRAGMA Statements - PRAGMA schema.wal_checkpoint;
当我尝试获取上次修改时间时,数据仅写入
wal 文件,而不是实际的数据库。
-wal 文件被视为数据库并被读取/更新,如果它们在 -wal 文件中,则从 -wal 文件中提取任何更改。 SQLite 相当安全/坚固。
示例
以下是检查点的示例:-
public static int checkpointDB(SupportSQLiteDatabase db) {
String TAG = "CHECKPOINTDB";
int wal_busy = 99, wal_log = 99, wal_checkpointed =99;
Cursor csr = db.query("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.query("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.query("PRAGMA wal_checkpoint(TRUNCATE)", null);
csr.getCount();
csr = db.query("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();
return wal_busy;
}
可以调用,(其中mPDB是构建的PersonDatabase对象,上面在PersonDatabase(@Database)类中) ,使用类似的东西:-
PersonDatabase.checkpointDB(mPDB.getOpenHelper().getWritableDatabase());
一个示例用法导致:-
2019-07-13 08:15:54.997 18556-18556/s.e.s56720641roomwithmanytomany D/CHECKPOINTDB: Mode is wal
2019-07-13 08:15:54.997 18556-18556/s.e.s56720641roomwithmanytomany D/CHECKPOINTDB: Checkpoint pre checkpointing Busy = 0 LOG = 0 CHECKPOINTED = 0
2019-07-13 08:15:55.000 18556-18556/s.e.s56720641roomwithmanytomany D/CHECKPOINTDB: Checkpoint post checkpointing Busy = 0 LOG = 0 CHECKPOINTED = 0
导致:-