与iPhone和Web服务的双向同步

时间:2010-12-30 12:16:15

标签: iphone database web-services synchronization

是的我知道有几个问题与iPhone和Web DB的同步有关,但没有一个问题对我有帮助。 我也做了很多谷歌搜索,但我很少发现有关双向同步的信息。也许我只是使用了错误的关键字。


我正在构建一个应用程序,我想出了为我的应用程序和我的Web服务添加两个同步的想法。 我的第一个想法是,这将是非常容易的,但事实证明并非那么容易。 我发现了一些问题并解决了我的问题,但我想听听你们这些灵魂是否会产生其他问题,或者这些解决方案是好还是坏。

我的应用程序的想法是帮助我同步我的笔记,我将随身携带我的iPhone,在工作或在家里使用Web应用程序。 这两个端应始终同步,因为我不知道我将用哪个设备(iPhone或计算机)来拍摄,编辑或只读我的笔记。

双方都有:

对于我的Web服务(和Web应用程序),我将使用rails,我认为数据库方面的mysql。 在iPhone上,我将使用带有Objective-C包装器(FMDB)的SQLite DB。 两者都将通过JSON交换数据(在iPhone端使用JSON框架)。

到目前为止我的想法:

  1. 主键必须在双方都是唯一的

    作为主键,我将使用UUID。我认为这是双方独特的解决方案,不会有任何重复(至少我希望如此)。

  2. 数据更改的修订

    每次更改都会以SHA1键保存为修订版,我将从date + note data创建。 修订对象还包括以下信息:

    • 日期
    • 哪个音符对象属于此修订版
    • 对哪个设备进行了更改?
    • 什么扯皮? (我不确定是否包含此信息)
  3. 到目前为止,我的“解决方案”是我将在一个hetroy-table上跟踪每个修改(创建,更新,删除)以及双方的修订。 在iPhone方面,我将首先从Web DB更新我的历史表,然后将我的更改提交到Web DB。 这应该有用,对吧?

    这对我来说听起来并不坏,但我的问题是如何处理冲突?我不想打扰用户如何处理冲突的消息。

    我的问题总结:

    1. 我的“解决方案”是好还是坏?我应该改变什么才能让它变得更好?
    2. 如何处理更改冲突,以便用户不会注意到它们?
    3. 你有任何关于双向协同的资料吗?
    4. 修改

      谢谢大家的回答。我现在知道,我并不是唯一遇到这个“问题”的人,并没有针对所有应用程序的简单而全面的解决方案。我认为到目前为止我的想法或解决方案做得很好,我会尝试提出同步规则。

      到目前为止,我的想法是:我会尽可能简单地开发它,并将它用于我自己的需要。解决我在使用和同步时发现的问题。之后我会邀请我的朋友来测试并解决他们遇到的问题。 我认为这样我可以提出用于将数据与Web同步的真实世界规则,因为我看到人们在做什么以及问题在哪里。

      你的想法是什么?

2 个答案:

答案 0 :(得分:11)

“这取决于。”

每个人都喜欢他们的答案。

双向同步从根本上归结为解决冲突。只有你作为应用程序设计师才能提出解决冲突的规则。

没有冲突,同步很容易。

同步的一种方式是“简单”,因为它就像双向同步一样,除了冲突规则总是有利于一方。 “让它看起来像那样。”简单的规则。

细粒度的双向同步不是那么难,你只需要记录所做的具体更改以及何时完成,然后在同步时,从各方获取更改日志,将它们合并到单个日志,然后将该日志应用于从上次同步开始的每一方。

根据具体的变化,我并不是说“记录改变了”,因为它太粗糙了。相反,您想知道记录的“lastName”已更改。它在01/01/2011 12:23:45发生了变化。

当A方说lastName在2011年1月1日12:22:45更改为“Johnson”而B方说lastName在01/01/2011 12:22:46更改为“Smith”,然后“Smith”是正确的答案,因为它是最新的。

但等等,你看到那里发生了什么?我只是凭空捏造了一条规则。 “最新胜利”。也许这对你不起作用,也许你有不同的规则。 “它取决于”。

所以,真的,这一切都归结为规则。您可以根据需要将其制作成细粒度。总会有冲突。这就是规则的用途。

所以你需要决定那些适合你的应用程序。

答案 1 :(得分:1)

实际上我认为任何一种双向同步的唯一问题只发生在存在冲突时。真。以任何版本控制系统(svn,cvs,git等)为例。他们更精细地解决了这个冲突,因为他们拆分文件本身,并且他们正在检查行冲突,因此文件的两个不同部分的更改不会被视为冲突。 但是我认为这个解决方案不太可行,因为实现它很痛苦:) ...

如果您决定在笔记层面处理冲突而不是线条,那么可能在一天结束时您需要提出一些业务规则来定义当存在导致冲突的更改时会发生什么。 可能性:

  1. 使用上次更改。覆盖旧版本。这很简单。

  2. 当我们在多台机器上更改同一文档时,Dropbox使用的解决方案我已经看过几次,它创建了多个附加后缀的文件,让用户知道多个上的更改机器。这样的事情你也可以用笔记轻松完成。

  3. 我不确定我是否已帮助过...... Moszi