自动备份SQLite数据库

3

我的应用使用一个小型的SQLite数据库,我希望将其备份。我认为这不会自动发生,除非我编写fullBackupContent代码,如下所示。我该如何修改backupscheme.xml文件的内容以正确设置包含路径?我更喜欢在运行时设置数据库位置。

我的backupscheme.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content >
    <include domain="database" path="device_info.db"/>
</full-backup-content

我的清单包含:

    <application
    android:allowBackup="true"
    android:icon="@drawable/time_machine_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" 
    android:name="mypackage.myapp"
    android:fullBackupContent="@xml/backupscheme" 
    > 

嗯,如果您的数据库名为device_info.db,那么看起来您已经准备好进行备份了。 - CommonsWare
好的,那不是名字,但我认为我必须使用完整路径填充路径,例如/data/mypackage.myapp/databases/mydatabase.db。 - Phil O
你为什么认为它不会自动发生呢?我以为如果你定义了android:allowBackup="true",所有的东西都会被备份,包括数据库,不是吗? - Emil
1个回答

4
<include domain="database" path="device_info.db"/>

这里,域名表示解释path的根目录。如果您使用以下内容,则database默认映射到SQLite数据库存储的位置:

  • Context上的getDatabasePath()
  • 只需使用普通文件名的SQLiteOpenHelper
  • 只需使用普通文件名的openOrCreateDatabase()

在这种情况下,文件名应该是您的path值。

如果由于某种原因您的数据库存储在其他地方,则需要对<include>指令进行一些调整。


那简化了事情。谢谢。你知道自动备份实际上是何时/多久发生一次吗?有没有办法强制执行这个问题? - Phil O
@PhilO:对于测试,请按照说明进行操作。在“真实世界”中,我不知道备份何时/多久发生,除非它与文档中列出的条件相关联。 - CommonsWare
1
@CommonsWare 嗯,就是这个问题。在我的测试中,我发现我没有丢失任何数据,这让我猜测备份功能是否会执行类似于 PRAGMA wal_checkpoint(2) 的操作。https://dev59.com/smcs5IYBdhLWcg3wWClB - Mark
1
仅提供一些更多的细节,关于备份应用时存在.db.db-shm.db-wal文件的位置(但只有在备份规则XML中指定的.db):当我使用ADB触发备份,然后清除数据,然后恢复时,我注意到.db.db-wal文件以原始形式/大小进行恢复(即没有发生检查点)。.db-shm没有被恢复,但我想那也不是必要的。 - Mark
1
顺便提一下,并非所有的 wal_checkpoint 命令都会删除 -wal 文件。例如,PRAGMA wal_checkpoint(TRUNCATE) 会导致一个长度为0的 -wal 文件。无论如何,在备份/恢复期间不会发生任何类型的 wal_checkpoint - Mark
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接