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