同步Mac和iPhone之间的核心数据模型

问题描述:

我目前正在构建我的核心数据模型,我想在我的应用程序的Mac和iPhone版本之间进行同步。同步Mac和iPhone之间的核心数据模型

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

到目前为止,我已经为每个将参与同步的对象添加了UID和修改时间戳记,所以我应该能够匹配对象并检测哪些对象发生了变化。

在这种情况下,是否有任何有关编写同步代码的良好链接资源,即在模型的两个实例之间同步记录?

Sync是过去很多人已经解决了很多问题的边缘案例,所以我希望能够找到关于这个主题的一些信息,但是我可以找到的所有信息都是Apple的SyncServices链接在iPhone上不存在)和一些MS同步技术。

我真的在寻找一般理论,所以我可以自己实现它,不一定是现成的解决方案。

SyncML规范可能有帮助,但它很难阅读,而且显然偏向于SyncML。

我已经实现这个任务教练,所以这里有一些想法:

一个修改标志是不够的,一个时间戳并没有真正提供更多的信息。通常情况下,我的目标是在这些状态中的一种:

  • 删除
  • 修改

下列转变发生当对象被修改:

  • 无 - >已修改
  • 新建 - >新建
  • 删除 - >(不应发生)
  • 修改 - >修改

以及随后的一,当它被删除:

  • 无 - >删除
  • 新增 - >实际删除(可能会从存储中删除)
  • 删除 - >(不应该发生)
  • 已修改 - >已删除

同步时,设备首先将状态不是None的所有对象发送到桌面。桌面要求用户解决冲突,如果其中之一的状态为!=无。在任何情况下,该对象都会进入设备的None状态,或者如果其状态为Deleted,则从存储中删除。

然后,桌面将自己的更改发送到设备。由于设备上的所有对象都处于None状态,因此不存在冲突。桌面上的对象也会进入状态“无”或从存储中删除,并且同步结束。

有两种类型的可能的冲突,这取决于设备/桌面状态:

  • 改性/删除。如果用户选择信任该设备,则桌面对象将被替换为设备一;否则,桌面不做任何操作并保持已删除状态,以便在阶段2中将该设备从设备中移除。
  • 删除/修改:如果设备获胜,则实际上将从桌面删除该对象。否则,对象将在桌面上进入状态New,以便在阶段2中恢复设备。
  • 删除/删除:Duh。只需从存储中删除它。
  • 修改/修改:用户决定保留哪些值,可能是逐个字段。的状态保持到修改在桌面上,以便这些选择被传播回设备在相位如果修改后的状态被保持的每个字段可避免2.

某些冲突,使得例如与一个对象设备上的修改的主题和桌面上的修改的摘要不会引发冲突。

您可以查看Task Coach的代码示例(SourceForge上的SVN存储库,它具有Python中的桌面应用程序和iPhone应用程序)。实际上,在这种情况下,我决定采用更简单的方法;我没有跟踪桌面上的状态。在阶段1(设备到桌面)之后,我只是用桌面上的设备完全替换设备上的对象。因此,不存在冲突(设备总是获胜)。

显然,这只适用于两个固定设备之间;如果你想与几个手机/桌面应用同步,你必须分配一个唯一的ID,并为不同的设备/应用保持不同的状态。这可能开始变得毛茸茸。

HTH

+0

时间戳有助于区分两个设备上的并发编辑。如果你只是使用一个布尔'修改'标志,那么很难知道哪个是最近的数据。 – AlBlue 2009-08-19 12:32:04

+0

感谢fraca7,这只是我追求的那种东西。我也会研究SyncML文档,看看他们是否进入这种细节。任何其他建议任何人? – 2009-08-19 13:58:56

+0

AlBlue:那就是如果你想要某种自动冲突解决方案,但我宁愿问问用户。如果两个记录都被修改了,他应该是那个决定的人。 – fraca7 2009-08-20 06:34:24

马库斯Zarra创建了一个名为ZSync简化synching iPhone/iPad应用到Mac同行框架。看看它,它可能有助于解决问题。

+0

感谢John,我一直在关注ZSync一段时间,我只是在等着看它在真实世界的应用程序中的表现。它看起来像一个伟大的项目,可以很好地满足我的需求。 – 2010-08-04 09:09:20

+0

很可靠MoneyWell for iPhone现在正在使用ZSync(http://nothirst.com/moneywell/iphone/) – petert 2010-08-24 14:22:45