与iPhone和Web服务双向同步

与iPhone和Web服务双向同步,iphone,database,web-services,synchronization,Iphone,Database,Web Services,Synchronization,是的,我知道有几个问题与iPhone和Web DB的同步有关,但没有一个对我有帮助。 我也做了很多谷歌搜索,但我很少找到关于双向同步的信息。也许我只是用错了关键词 我现在正在构建一个应用程序,我想出了一个主意,在我的应用程序和Web服务中添加两个同步。 我的第一个想法是,这将是可笑的容易,但事实证明,这并不是那么容易。 我发现了一些问题和一些解决方案,但我想听听你们的意见,这些解决方案是否会产生其他问题,或者这些解决方案是好是坏 我的应用程序的想法是帮助我同步笔记,我将在外出时使用iPhone

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


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

我的应用程序的想法是帮助我同步笔记,我将在外出时使用iPhone,在工作中或在家中使用Web应用程序。 这两个端点应该始终同步,因为我不知道在任何时候我将使用哪种设备(iPhone或计算机)来记录、编辑或只是阅读我的笔记

我两边都有什么:

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

我目前的想法:

  • 主键在两侧都必须是唯一的

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

  • 数据更改的修订

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

    • 日期
    • 哪个注释对象属于此修订
    • 在哪个设备上进行更改
    • 发生了什么变化?(通常我不确定是否包含此信息)
  • 到目前为止,我的“解决方案”是,我将跟踪历史记录表的每一次修改(创建、更新、删除),两侧都有修订。 在iPhone端,我将首先从Web DB更新我的历史记录表,然后将我的更改提交到Web DB。 这应该管用,对吧

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

    我的问题综述:

  • 我的“解决方案”是好还是坏?我应该做些什么来改善它
  • 我如何处理更改冲突,以便用户不会注意到它们
  • 你有我能读到的关于双向精神病的资料吗
  • 编辑:

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

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

    你怎么想?

    “这要看情况而定。”

    每个人都喜欢他们答案中的那句话

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

    没有冲突,同步很容易

    单向同步很“容易”,因为它就像双向同步一样,只是冲突规则总是偏向一方。“让这个看起来像那个样。”简单的规则

    细粒度双向同步并不难,您只需要记录所做的特定更改以及更改完成的时间,然后在同步时,从各方获取更改日志,将其合并到单个日志中,然后从上次同步开始将该日志应用到各方

    我所说的具体变化不是指“记录改变”,因为它太粗糙了。相反,您想知道记录的“lastName”已更改。更改时间为2011年1月1日12:23:45

    当甲方在2011年1月1日12:22:45将姓氏改为“约翰逊”,而乙方在2011年1月1日12:22:46将姓氏改为“史密斯”时,则“史密斯”是正确答案,因为它是最新的

    但是等等,你看到那里发生了什么吗?我只是凭空制定了一条规则。“最新胜利”。也许这不适合你,也许你有不同的规则。“视情况而定”

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


    所以你需要决定这些是什么样的应用程序。

    < P>实际上,我认为在任何类型的双向同步中唯一的问题只有发生冲突时才发生。真正地以任何版本控制系统(svn、cvs、git等)为例。它们更精确地解决此冲突,因为它们分割文件本身,并且检查行冲突,因此文件两个不同部分中的更改不会被视为冲突。 然而,我认为这个解决方案不太可行,因为实施起来很痛苦:)

    如果您决定在notes级别处理冲突,而不是在其行中,那么可能在一天结束时,您需要制定一些业务规则,定义在发生导致冲突的更改时会发生什么。 可能性:

  • 用最后的零钱。覆盖旧的。这很容易

  • Dropbox使用的一个解决方案是,当我们在多台机器上更改同一文档时,我已经见过好几次了,它创建多个文件,并附加一个后缀,让用户知道多台机器上的更改。像这样的事你很容易就能做到