评估将核心数据与 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
,从而替换后者。
问题:
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 同步