【问题标题】:Automatically backing up SQLite database自动备份 SQLite 数据库
【发布时间】:2016-03-16 21:22:01
【问题描述】:

我的应用程序使用了一个我希望备份的小型 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,那么您似乎有合适的东西来备份它。
  • 嗯,这不是名字,但我认为我必须使用完整路径填充路径,例如 /data/mypackage.myapp/databases/mydatabase.db
  • 为什么你认为它不会自动发生?我虽然如果你定义 android:allowBackup="true",所有的东西都被备份包括数据库不是吗?

标签: android sqlite backup


【解决方案1】:
<include domain="database" path="device_info.db"/>

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

  • getDatabasePath()Context
  • SQLiteOpenHelper 只是一个简单的文件名
  • openOrCreateDatabase() 只是一个简单的文件名

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

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

【讨论】:

  • 这简化了事情。谢谢你。您知道自动备份实际发生的时间/频率吗?有没有办法强制解决这个问题?
  • @PhilO:用于测试,follow the instructions。在“现实世界”中,我不知道备份发生的时间/频率,除了它与the documentation 中列出的条件有关。
  • @CommonsWare 好吧,就是这样。在我的测试中,我发现我没有丢失任何数据,这让我推测备份功能可能会像PRAGMA wal_checkpoint(2)stackoverflow.com/questions/12928294/…
  • 只是在备份存在.db.db-shm.db-wal 文件的应用程序时提供更多详细信息(但仅在备份规则XML 中指定.db):当我使用 ADB 触发备份,然后执行清除数据,然后恢复,我注意到 .db.db-wal 文件都以原始形式/大小恢复(即没有发生检查点)。 .db-shm 没有恢复,但我想无论如何都不需要。
  • 附带说明,并非所有wal_checkpoint 命令都会删除-wal 文件。例如,PRAGMA wal_checkpoint(TRUNCATE) 生成长度为 0 的 -wal 文件。无论如何,在备份/恢复期间不会出现任何类型的 wal_checkpoint
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多