评估将核心数据与 Dropbox 同步的策略

Posted

技术标签:

【中文标题】评估将核心数据与 Dropbox 同步的策略【英文标题】:Evaluation of a strategy to sync Core Data with Dropbox 【发布时间】:2013-07-24 23:09:01 【问题描述】:

这个问题是关于使用 Dropbox 在多个 ios 设备之间同步 sqlite Core Data 存储的。考虑这种安排:

    一个应用使用了一个核心数据存储,称之为local.sql,保存在应用自己的NSDocumentDirectory

    该应用使用 Dropbox Sync API 来观察用户 Dropbox 中的某个文件,例如 user/myapp/synced.sql

    应用程序观察NSManagedObjectContextDidSaveNotification,并在每次保存时将local.sql复制到user/myapp/synced.sql,从而替换后者。

    1234563堆。同时,用户会在 UI 中看到“正在同步”或“正在加载”。

问题:

A.这种安排是否非常低效,以至于应该完全避免?如果能保证数据库不大呢?

B.这种安排是否有利于文件损坏?不仅仅是通过 deltas/changelogs 同步?如果有,请您详细说明原因吗?

【问题讨论】:

您可能会发现这个人通过 Dropbox 访问 Sqlite 的实验很有趣。 TLDR:它不起作用:dailydoseofexcel.com/archives/2012/04/19/sqlite-and-dropbox 【参考方案1】:

A.这种安排是否非常低效,以至于应该完全避免?如果能保证数据库不大呢?

无关紧要,因为:

B.这种安排是否有利于文件损坏?不仅仅是通过 deltas/changelogs 同步?如果有,请您详细说明原因吗?

是的,非常如此。几乎保证。我建议查看How to Corrupt An SQLite Database File。您可能会立即提交第 1 节中描述的至少两个问题,包括在事务处于活动状态时复制文件和删除(或无法复制,或制作无用的副本)日志文件。在任何严肃的测试中,您的方案都可能几乎立即崩溃。

如果这还不够糟糕,请考虑两个设备同时保存更改的情况。然后怎样呢?如果幸运的话,您只会得到 Dropbox 臭名昭著的文件“冲突副本”副本之一,“仅”意味着丢失一些数据。如果没有,您将再次陷入完全数据库损坏。

当然,为了同步而拆除 Core Data 堆栈会给用户带来极大的不便。

如果您想考虑通过 Dropbox 同步 Core Data,我建议您选择以下方法之一:

    Ensembles,可以通过 Dropbox(同时避免上述问题)或 iCloud(同时避免 iOS 内置的 Core Data/iCloud 同步问题)进行同步。 TICoreDataSync,它使用 Dropbox 文件同步,但避免将 SQLite 文件放入文件存储中。 ParcelKit,它使用 Dropbox 的新数据存储 API。 (请注意,这是相当新的内容,数据存储 API 本身仍处于测试阶段)。

【讨论】:

以上是关于评估将核心数据与 Dropbox 同步的策略的主要内容,如果未能解决你的问题,请参考以下文章

使用 MAMP Pro 3 将 mysql 数据库与 Dropbox 同步

如何使我的数据库与 TICoreDataSync 保持同步?

dropbox无法使用了,怎么办

同步 SQLite 数据库和 Dropbox 数据存储

将点文件与 Dropbox 同步 [关闭]

在 ubuntu linux 中同步 dropbox 和 xampp htdocs,不包括临时文件