在Mac和iPhone之间同步Core Data模型

4

我正在构建我的Core Data模型,希望在Mac和iPhone应用程序的版本之间进行同步。

我将使用Bonjour进行设备发现等操作,但是我有一个关于数据同步部分的问题。

到目前为止,我已经为每个参与同步的对象添加了UID和修改时间戳,因此我应该能够匹配对象并检测哪些对象已更改。

是否有关于编写此类情况下同步代码的好链接和资源,例如在两个模型实例之间同步记录?

同步是一个具有许多边缘情况的问题,过去已经有很多人解决了这个问题,因此我期望能够找到一些相关信息,但我只能找到指向Apple SyncServices(在iPhone上不存在)和一些微软同步技术的链接。

我真正寻找的是通用理论,以便我自己实施,而不一定是现成的解决方案。

2个回答

8
SyncML规范可能会有所帮助,但很难阅读,并且明显偏向SyncML。
我必须为Task Coach实现此功能,因此这里提供一些想法:
仅使用修改标记即可,时间戳并没有提供更多信息。通常,我的对象处于以下状态之一:

新建
删除
已修改
当对象被修改时,发生以下转换:
无 → 已修改
新建 → 新建
删除 → (不应该发生)
已修改 → 已修改
当对象被删除时,发生以下转换:
无 → 删除
新建 → 实际删除(可能从存储中删除)
删除 → (不应该发生)
已修改 → 删除
在同步时,设备首先向桌面发送所有具有状态不同于“无”的对象。如果其中一个对象在其侧具有状态!= None,则桌面会要求用户解决冲突。在任何情况下,该对象都会进入设备上的状态“无”,或者如果其状态为“删除”则从存储中删除。
然后,桌面将自己的更改发送到设备。由于所有对象在设备上都处于状态“无”,因此不存在冲突。桌面上的对象也进入状态“无”或从存储中删除,同步结束。
根据设备/桌面状态,存在两种可能的冲突类型:
修改/删除。如果用户选择相信设备,则桌面对象将被设备对象替换;否则,桌面不执行任何操作并保持删除状态,以便在第2阶段中从设备中删除该对象。
删除/修改:如果设备获胜,则实际从桌面中删除该对象。否则,对象进入在桌面上的“新建”状态,以便在第二阶段中在设备上恢复它。
删除/删除:嗯。只需将其从存储中删除即可。
修改/修改:用户决定保留哪些值,可能是基于每个字段的选择。状态保持为已修改,以便在第2阶段将这些选择传播回设备。
如果为每个字段保留了修改状态,则可以避免某些冲突,从而例如在设备上具有已修改主题和桌面上具有已修改概述的对象不会触发冲突。
您可以查看Task Coach代码作为示例(源Forge上的SVN存储库,它包含Python的桌面应用程序和iPhone应用程序)。实际上,在这种情况下,我决定使用更简单的方法; 我不跟踪桌面上的状态。在第一阶段(设备到桌面),我只是用桌面上的对象完全替换设备上的对象。因此,没有冲突(设备总是获胜)。
显然,这只适用于两个固定设备之间的同步;如果您想要与多个手机/桌面应用程序同步,您需要为每个分配唯一的ID,并为不同的设备/应用程序保留不同的状态。这可能会变得复杂。

希望对您有所帮助。

时间戳有助于区分两个设备上的并发编辑。如果只使用布尔值“modified”标志,则很难知道哪个是最新的数据。 - AlBlue
谢谢fraca7,这正是我需要的东西。我也会查看SyncML文档,看看它们是否详细介绍了这个问题。还有其他建议吗? - Charles Gamble
AlBlue:如果你想要某种自动冲突解决方式,那可以这么做,但我宁愿询问用户。如果两条记录都被修改了,应该由用户决定。 - fraca7
经过将近一年的时间,我认为fraca7的回答最接近问题的答案,尽管在这种情况下,我希望Marcus Zarra的ZSync框架能够为我处理大部分内容。谢谢大家。 - Charles Gamble

2

Marcus Zarra创建了一个名为ZSync的框架,用于简化将iPhone/iPad应用程序与其Mac版本同步的过程。看看它,它可能有助于解决问题。


谢谢John,我一直在关注ZSync,只是想先看看它在实际应用中的表现如何。不过它看起来是一个很棒的项目,而且可能非常适合我的需求。 - Charles Gamble
相信MoneyWell for iPhone现在正在使用ZSync(http://nothirst.com/moneywell/iphone/) - petert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接