Android sqlite backup/restore 不覆盖

Android sqlite backup/restore without overwriting

简短问题:从后续的内容来看,我似乎应该强调和简化我的问题的核心。核心是:Android 数据库的其他备份选项似乎存在还原可能覆盖数据库中当前数据的风险。是这样吗,有没有办法 backup/restore 没有这种风险?

.

长格式问题: 在查看了关于在 Android 上备份 SQLite 数据库的许多(相当多的)问题后,我有一个问题想问找不到答案。

所有其他 backup/restore 讨论都涉及将 db 文件保存到 SD(或者,在 How to backup/restore SQLite database on Android to Dropbox 中,保存到云),然后在需要时恢复它。我担心的是,恢复不会覆盖当前数据库吗?

我担心用户何时新安装了他们使用了很短时间(生成新数据)的应用程序,然后想要从该应用程序的先前备份导入数据。对于所有其他 backup/restore 方法,恢复旧数据库文件似乎会覆盖当前数据库文件中的任何新数据。我想要的是一个备份选项,在恢复时,将备份中的数据添加到当前数据库中以使其完整而不覆盖其中的任何其他内容。

其他方法也这样做吗?还是像我怀疑的那样,在这种情况下他们会覆盖?

如果他们真的覆盖了,那么我最好的备份选择可能是写出到 csv 或 xml 文件或其他东西,我希望这些备份讨论是关于简单的方法来做到这一点。是否有任何流程可以加快该流程并使其变得简单,还是我必须手动完成所有这些工作?如果是这样,关于写入格式的建议以及为什么?

同样,有谁知道使用 BackupAgentHelper 的内置 Google 备份是否会出现同样的覆盖问题?

最后,如果我最终在任何时候经历了数据迁移(类似于 How to Restore SQLite Database from Backup after Core Data model has changed (lightweight migration)),我现在应该做什么(我仍处于数据库设计阶段)来创造这样一个潜在的未来相对于此备份过程更容易改变?

我认为在您描述的场景中,在不更改(或冲突)“新”数据的情况下恢复旧数据的问题并不是很难解决。看起来基本上你只是想将旧数据(记录)“添加”到新数据库,假设旧数据与新数据没有逻辑冲突(也就是说,为新数据创建新记录在语义上是可以的)旧数据)。我相信在恢复期间处理主键冲突将是需要考虑的最重要的问题。

我们来看两个案例:

1:您正在使用数据库的自动生成主键值功能(例如,使用 SQLite table 的 AUTOINCREMENT 列)。

假设“较新”的数据库记录在恢复过程开始之前可能使用了 1 到 10 的主键 (ROWID) 值。如果您的数据库记录具有任何这些主键值(1 到 10),那么只有当您想要保留这些旧的主键值时才会遇到问题。为避免该问题,不要保留“旧”记录的“旧”主键值——从“旧”数据库读取记录后,只需保存“旧”记录的其他属性(列)的值并让数据库为这个“恢复”记录生成一个新的主键值。本质上,“旧”记录使用新的主键值保存。如果您担心在这个“恢复”过程之后保持记录的时间顺序,我建议您还保留一个时间戳列,其值在此过程中不会改变。

2:您正在使用替代机制(UUID、序列生成器等)来生成主键值:

在这种情况下,读取“旧”记录并在将其保存到“较新”数据库之前,将“旧”主键值替换为通过备用机制生成的主键值 – 按照设计,保证“恢复”记录的主键值相对于先前存在的“较新”记录的唯一性。

为了简化此“恢复”过程的编程工作,尤其是当您处理多个 table 时,您可以使用像 JDXA 这样的 ORM。 SDK 附带的示例应用程序之一说明了在将数据库升级到较新版本时传输“旧”数据的类似技术。 JDXA 还提供了一种方便的序列生成器机制,可以轻松高效地创建唯一 ID,您可以在持久化对象之前将其分配给对象。

在继续研究之后,我越来越得出结论,没有更好的方法来解决这个问题。对于简单的备份,您可以像许多其他线程讨论的那样简单地复制数据库文件,并保留未解决的恢复覆盖问题(显然还有兼容性问题的风险:)。对于真正可靠的备份,您只需将整个数据库写入 XML,然后将其读回并完成所有相关工作。

我发现的唯一更好的选择在 which refers to the new Android feature Configuring Auto Backup for Apps 中提到,但仅适用于 Android 6.0 及更高版本。我将对此进行测试,但如果它不起作用,并且对于 Marshmallow 以下的任何内容,似乎将我的整个数据库写入 XML 然后再次读回是唯一真正可靠的方法。 不完全是一个惊喜,但很高兴知道。