Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 9数据库日志模式在备份时出现问题_Android_Sqlite_Database Backups_Sqlite Journal Mode - Fatal编程技术网

Android 9数据库日志模式在备份时出现问题

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时,如何正确复制/恢复*.

我的应用程序中有一些备份/恢复功能,这会在使用>=Android 9时造成问题,SQLite数据库使用的是日志模式WAL,而不是旧手机上使用的删除模式WAL。我的SQLLite版本是3.25.2

更多信息:

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

问题:

  • 如何以及在何处检查*.db文件的日志模式是否为WAL

  • 当SQLite journal_模式为WAL时,如何正确复制/恢复*.db文件
  • 如何以及在何处将所有手持设备的SQLite journal_模式从WAL切换到DELETE

  • 一些好的背景阅读

    对第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
    ,并且在所有读取连接关闭之前不会关闭它