我想知道在 android 上备份和恢复 SQLite DB 的最佳实践是什么。目前,我通过备份数据库并使用文件输入/输出流将其复制到 sd 卡来解决这个问题。然后,如果我想恢复和旧备份,我会使用相反的过程。
此方法似乎有效,并且尚未损坏我的数据。我想知道这是否是最好的方法,或者是否有更安全的方法?
谢谢
只是一个关于备份数据库的 FYI。我目前在我的应用程序中执行此操作的方式与您在上面解释的方式相同。以这种方式创建备份时要小心。它在大多数情况下都很好用,但问题是创建的备份不能保证与所有设备和 Android 版本兼容。我第一次听说这听起来很奇怪,但我现在发现这是真的。我最近收到了几份关于丢失数据、消失数据等的报告。当用户从不同的设备或不同的 Android 版本或 ROM 恢复备份时,这一切都发生了。他们中的一些人直接联系了我,这很好,所以我能够从他们那里获取备份文件来测试它们并检查它们。当我尝试恢复它们时,我会收到以下 logcat 错误:android.database.sqlite.sqlitedatabasecorruptexception:数据库磁盘映像格式错误
我发现,主要是某些 HTC 设备和一些自定义 rom(在任何设备上)正在创建这些备份,这些备份不会恢复到其他设备或 rom。数据库并没有真正损坏,但 Android 认为它们是。我会将它们带入 SQLite 浏览器,那里也不会显示任何数据。事实证明,较新版本的 SQLite 默认启用了 WAL(预写日志),如果启用并使用该数据库进行备份,则无法将其恢复到旧版本的 SQLite,甚至有时甚至无法恢复到相同版本(对于一些奇怪的原因)。因此,我使用“PRAGMA journal_mode = DELETE”禁用了 WAL,然后我能够在浏览器中查看数据库并能够在我的测试设备上恢复它。另一个问题是没有'
很抱歉,回复太长了,但我想解释一下我在这种备份中看到的情况。我正在尝试寻找另一种在 SD 卡上创建通用备份的方法。创建 csv 文件和像@Kingamajick 说的 sql 脚本可能是另一种方法。它需要更多的代码和更多的工作,但如果它适用于任何设备、SQLite 版本和 ROM,那么它是值得的。您的客户丢失数据绝不是一件好事。
这似乎是最好的方法。您可能需要考虑在复制 SQLite 文件并将其与目标文件进行比较之前对它进行校验和,以获得额外的保证。只需确保在获取副本时没有打开的数据库连接,否则在恢复时可能会导致数据库处于意外状态。
我能看到的唯一另一种方法是读取数据库的实际内容并生成一个包含可以从中恢复的 SQL 的文件,这显然是一个更复杂的并且不提供任何优势证明这种复杂性是合理的。
我会在 Kingamajick 的回答中添加一条额外的评论(论坛不允许我将其添加为实际评论)。在简单地复制文件的方法中,如果用户曾经恢复数据库并且其中已经有任何数据,它将被覆盖。例如,如果用户升级到新手机,使用一段时间,然后从旧手机恢复数据库,则新手机上已有的所有数据都将丢失。这是读取数据库并将其写入文件(XML 或 CSV 等)的复杂性的一个优势。
我发布了另一个问题(Android sqlite backup/restore without overwriting),希望有人有更好的解决方案来避免这个问题,但到目前为止似乎还没有。在这和 ssuperz28 指出的担忧之间,备份数据库似乎更安全的方法是将其写入 xml,然后读取它并在恢复时将其重新添加。
此外,https://stackoverflow.com/a/34477622/3108762是我迄今为止看到的其他建议中最好的,并承诺从 Marshmallow 开始以更好的方式解决这个问题。