Android 9数据库日志模式在备份时出现问题
我的应用程序中有一些备份/恢复功能,这会在使用>=Android 9时造成问题,SQLite数据库使用的是日志模式WAL,而不是旧手机上使用的删除模式WAL。我的SQLLite版本是3.25.2 更多信息: 我正在使用完全集成到我的项目中的Sugar ORM。Sugar ORM使用自己的类,例如扩展SQLiteOpenHelper的SugarDb,并且该类是只读的 问题:Android 9数据库日志模式在备份时出现问题,android,sqlite,database-backups,sqlite-journal-mode,Android,Sqlite,Database Backups,Sqlite Journal Mode,我的应用程序中有一些备份/恢复功能,这会在使用>=Android 9时造成问题,SQLite数据库使用的是日志模式WAL,而不是旧手机上使用的删除模式WAL。我的SQLLite版本是3.25.2 更多信息: 我正在使用完全集成到我的项目中的Sugar ORM。Sugar ORM使用自己的类,例如扩展SQLiteOpenHelper的SugarDb,并且该类是只读的 问题: 如何以及在何处检查*.db文件的日志模式是否为WAL 当SQLite journal_模式为WAL时,如何正确复制/恢复*.
一些好的背景阅读 对第3条的答复。 在SQLiteOpenHelper的
onConfigure
中使用(或者在您的情况下,您可能需要扩展和重写SugarDb类来实现这一点)
您可能还需要扩展getInstance
来返回您自己类的一个实例(我认为在该覆盖中不调用super),然后在扩展类上调用SugarDb.getInstance()
调用getInstance
回答2。正如@commonware所说,如果数据库正确关闭,那么所有数据都会在关闭时从Wal文件提交到数据库文件
更新:
看着
每次调用SugarDb.getReadableDatabase()
或SugarDb.getwriteabledatabase()
时,都应该调用SugarDb.close()
最简单的方法是,一旦您完成了当前数据库操作,因为您无法查询它的连接计数,或者您可以在应用程序生命周期的不同时间(如onPause
或onDestroy
或尝试备份之前)维护自己的计数并关闭
回答1。最有用的方法,因此fare是一种检查数据库的方法,如:
谢谢大家的建议。“当使用SQLite journal\u模式时,如何正确复制/恢复*.db文件?”--理想情况下,首先关闭数据库。然后,应该只有
*.db
文件。WAL仅在数据库打开时相关。事实上,一旦关闭,它将提交。请每个问题提交一个问题,而不是三个问题。感谢您的回答。对于您的答案3->我创建了一个类,该类扩展了SugarDb,但在何处初始化class?在扩展应用程序的类中?public class TestExtSugar extensed SugarDb{public TestExtSugar(Context){super(Context);}@Override public void onConfigure(SQLiteDatabase db){super.onConfigure(db);db.disablewriteaheloging();}
对于您的答案2->在复制*.DB文件之前关闭DB的正确方法是什么?我假设Sugar ORM保持DB打开。更新的答案2,SugarDb似乎包装了getReadableDatabase
,并且在所有读取连接关闭之前不会关闭它