可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?
Posted
技术标签:
【中文标题】可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?【英文标题】:it is possible to stop creating .db-shm and .db-wal files in sqlite database android? 【发布时间】:2021-11-13 21:12:45 【问题描述】:我想停止创建 .db-shm
和 .db-wal
文件。我只想要我的数据目录的数据库文件夹中的.db
文件。
一些旧设备生成.db-shm
和.db-wal
,而一些最新设备生成.db-journal
。
当我尝试备份/恢复我的数据库文件时,这会产生问题。
我想知道是否可以通过android中的代码来实现?
【问题讨论】:
【参考方案1】:我想知道是否可以通过android中的代码来实现?
是的,这是可能的。
您可以使用 SQLiteDatabase 的 disableWriteAheadLogging 强制日志模式(这使用 -journal 文件,但在日志模式下,附加文件包含所做更改的日志,因此不需要该文件(仅用于回滚))方法(如果使用 SQLiteOpenHelper 的子类,我建议在 onOpen 方法中执行此操作。)
您还可以使用 SQLite 的 journal_mode PRAGMA(如果使用 SQLiteOpenHelper 的子类,我再次建议在 onOpen 方法中使用。)
另一种选择是保持 WAL 模式,但要确保数据库是完全检查点的。关闭数据库应该完全检查数据库,然后如果-wal文件仍然存在,它应该是空的,在这种情况下不需要。
我建议这是更好的选择。它适用于 WAL 或 JOURNAL 模式和单个备份文件。还有保存 -wal 和 -shm 文件的选项。
【讨论】:
我检查了 WAL 是否已启用,db..isWriteAheadLoggingEnabled()
表示 WAL 文件已禁用,但是当我检查应用程序数据目录中的数据库文件夹时仍然存在
@Milan.Tejani -wal 文件是空的吗? (0字节)如果是这样,它可能只是因为它以前存在而存在,有效地如果它是空的,它就没有用并且在恢复时不应该引起任何问题。【参考方案2】:
是的,可以停止创建 .wal 和 .shm 文件。观察到的一件事是,直到 Android 9 版本,系统使用原始 .db 文件创建 .wal 和 .shm 并在 Android 10 或此类文件的最新版本不存在,但有一个名为 .journal 的新文件。
要停止创建 .wal 和 .shm 等文件,只需在 SQLite 帮助器类中添加方法...
@Override
public void onOpen(SQLiteDatabase db)
super.onOpen(db);
db.disableWriteAheadLogging();
我已经通过这种方式解决了问题,并且肯定也适用于您的情况。
【讨论】:
以上是关于可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章