代码之家  ›  专栏  ›  技术社区  ›  Charles Gamble

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

  •  4
  • Charles Gamble  · 技术社区  · 17 年前

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

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

    到目前为止,我已经为将要进行同步的每个对象添加了一个uid和修改时间戳,所以我应该能够匹配对象并检测哪些对象发生了更改。

    对于为这种情况编写同步代码(即在模型的两个实例之间同步记录),是否有任何好的链接和资源?

    SYNC是一个相当多的边缘案例的问题,在过去人们已经解决了很多次,所以我希望能找到一些关于这个主题的信息,但我能找到的只是苹果的SyncServices(iPhone上不存在)和一些MS Sync技术的链接。

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

    2 回复  |  直到 16 年前
        1
  •  8
  •   fraca7    17 年前

    SYNCML规范可能会有所帮助,但很难阅读,而且明显偏向于SYNCML。

    我必须为任务教练实施这一点,所以这里有几个想法:

    修改标志就足够了,时间戳并不能提供更多的信息。通常,我的对象处于以下状态之一:

    • 没有
    • 新的
    • 删除
    • 被改进的

    修改对象时会发生以下转换:

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

    删除时的以下内容:

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

    同步时,设备首先向桌面发送状态不同于“无”的所有对象。如果其中一个具有状态,桌面会要求用户解决冲突!=侧面无。在任何情况下,对象在设备上都会进入“无”状态,或者在其状态被删除时从存储中删除。

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

    根据设备/桌面状态,可能存在两种类型的冲突:

    • 修改/删除。如果用户选择信任设备,桌面对象将替换为设备对象;否则,桌面将不做任何操作并保持已删除状态,以便在第2阶段从设备中删除该对象。
    • 删除/修改:如果设备获胜,则对象实际上从桌面上删除。否则,该对象将在桌面上进入“新建”状态,以便在第2阶段在设备上还原。
    • 删除/删除:duh。把它从仓库里拿出来。
    • 修改/修改:用户决定保留哪些值,可以逐个字段。状态在桌面上保持为“已修改”,以便在第2阶段将这些选项传播回设备。

    如果为每个字段保留修改状态,则可以避免一些冲突,例如,设备上具有修改主题的对象和桌面上的修改摘要不会触发冲突。

    例如,您可以查看任务coach的代码(sourceforge上的SVN存储库,它既有python中的桌面应用程序,也有iphone应用程序)。实际上,在本例中,我决定使用一种更简单的方法;我不跟踪桌面上的状态。在第1阶段(设备到桌面)之后,我只需将设备上的对象完全替换为桌面上的对象。因此,没有冲突(设备总是获胜)。

    显然,这只在两个固定设备之间工作;如果要与多个电话/桌面应用程序同步,则必须为每个设备/应用程序分配一个唯一的ID,并为不同的设备/应用程序保留不同的状态。这可能会开始发毛。

    高温高压

        2
  •  2
  •   John Wang    16 年前

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