备份时的Android 9数据库日志模式WAL问题

Posted

技术标签:

【中文标题】备份时的Android 9数据库日志模式WAL问题【英文标题】:Android 9 database journal mode WAL issue when backup 【发布时间】:2020-04-11 16:44:17 【问题描述】:

我的应用程序中有一些备份/恢复功能,当使用 >= android 9 时会导致问题,SQLite 数据库确实使用 journal_mode WAL 而不是他们在旧手机上使用的 DELETE。我的 SQLLite 版本是 3.25.2

更多信息:

我正在使用完全集成到我的项目中的 Sugar ORM。 Sugar ORM 使用自己的类,例如继承 SQLiteOpenHelper 的 SugarDb,并且该类是只读的。

问题:

    如何以及在何处检查 *.db 文件的 journal_mode 是否为 WAL? SQLite journal_mode为WAL时如何正确复制/恢复*.db文件? 如何以及在何处将所有手持设备的 SQLite journal_mode 从 WAL 切换到 DELETE?

【问题讨论】:

"当 SQLite journal_mode 为 WAL 时,如何正确复制/恢复 *.db 文件?" -- 理想情况下,先关闭数据库。然后,应该只有*.db 文件。 WAL 仅在数据库打开时才相关。 确实,关闭后它会提交。请每个问题一个问题,而不是三个问题。 【参考方案1】:

一些不错的背景阅读https://sqlite.org/wal.html

回答 3。 在 SQLiteOpenHelper 的 onConfigure 中使用 https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#disableWriteAheadLogging()(或者在您的情况下,您可能必须扩展和覆盖 SugarDb 类才能做到这一点。

您可能还必须扩展 getInstance 以返回您自己的类的实例(而不是我认为在该覆盖中调用 super),然后在您调用 SugarDb.getInstance() 的地方调用 getInstance 在您的扩展类。

回答 2。正如@CommonsWare 所说,如果您的数据库正确关闭,那么所有数据都会在关闭时从 Wal 文件提交到数据库文件。

更新: 看着https://github.com/chennaione/sugar/blob/master/library/src/main/java/com/orm/SugarDb.java

每次您拨打SugarDb.getReadableDatabase()SugarDb.getWritableDatabase()时,您都应该拨打SugarDb.close()

最简单的方法是在完成当前数据库操作后立即执行此操作,因为您无法查询它的连接计数,或者您可以在应用程序生命周期中的不同时间保持自己的计数并关闭,例如 onPause 或 @ 987654333@ 或在您尝试备份之前

回答1。https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase#isWriteAheadLoggingEnabled()

【讨论】:

感谢您的回答。 回答 3 -> 我创建了一个扩展 SugarDb 的类,但是在哪里初始化该类?在扩展应用程序的类中? public class TestExtSugar extends SugarDb public TestExtSugar(Context context) super(context); @Override public void onConfigure(SQLiteDatabase db) super.onConfigure(db); db.disableWriteAheadLogging(); 回答 2 -> 在复制 *.db 文件之前关闭数据库的正确方法是什么?我假设 Sugar ORM 使数据库保持打开状态。 更新了答案 2,SugarDb 似乎包装了getReadableDatabase,并且在所有读取连接都关闭之前不会关闭它【参考方案2】:

最有用的方法,so far 是检查点数据库中提到的方法: Backup sqlite db in WAL mode without FileStreams // by export/backup sql commands

谢谢大家的建议。

【讨论】:

以上是关于备份时的Android 9数据库日志模式WAL问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 9.0 SQLiteCantOpenDatabaseException SQLITE_CANTOPEN(不支持WAL模式)源码分析定位

Android 9.0 SQLiteCantOpenDatabaseException SQLITE_CANTOPEN(不支持WAL模式)源码分析定位

如何在Android 9(Pie)中备份数据库?

GRDB使用SQLite的WAL模式

android如何将SQLite 3.7 WAL文件的内容合并到主数据库文件中?

Postgresql主从配置