我正在开发一个需要与远程数据库同步的应用程序。数据库连接到基于Web的应用程序,用户可以修改网页上的某些记录。(添加/删除/修改)用户还可以修改移动应用程序中的相同记录。因此,当用户在移动应用程序中按下同步按钮时,每一方(服务器 - 客户端)必须保留SAME最新记录。服务器和客户端之间的通信由Web Serives。(SOAP)提供,我无法更改它,因为它是严格的要求。 (我知道这是可以使用的最差方式)。另一个要求是客户端无法删除服务器记录。
我已经熟悉通信Web服务(NSURLConnection),接收数据(NSData)和解析它。但我无法弄清楚同步过程应该如何。我已经阅读了this一些关于如何使用一些额外属性修改服务器和客户端的答案( last_updated_date 和 is_sync )
然后我可以想象解决这个问题:
作为第一步,客户端会尝试通过发送未同步的服务器来修改服务器记录。新的重新校正直接添加到数据库中,但应根据 last_updated_date 比较修改后的记录。 在此步骤结束时,服务器具有 最新数据 。
但问题是如何管理修改移动应用中的记录。我以两种方式思考:
是创建新MOC的最愚蠢方式,将所有记录下载到此中并使用现有记录进行更改。
是获取所有不在客户端的修改记录,将它们导入新的MOC并将这两者结合起来。但在这一点上我有一些担忧,如
可能有两个项目被复制(旧版本 - 更新版本)
已删除的项目仍可位于主要MOC中。
我必须连接MOC之间的多个关系。 (新记录与旧记录的关系可能超过4个)
所以我猜你们可以帮助我找到最好的想法吗?
答案 0 :(得分:1)
同步数据是一项非常重要的任务。
有几个级别的同步。基于您的问题,我猜你只需要将更改推送回服务器。在这种情况下,我建议在-save:
NSManagedObjectContext
期间捕捉它。在-save:
之前,您可以查询NSManagedObjectContext
并询问其创建,更新和删除的对象。从那里,您可以构建一个查询以回发到您的Web服务。
关于你的关系问题;我建议你打开第二个问题,这样就不会有混淆。
服务器完成合并后,会将新的“真相”推送给客户端。客户端应该获取这些更新的记录并将它们合并到自己的更改中。这种合并非常简单:
暂时忽略性能,这是相当直接的:
NSPredicate
以标识要更新/创建的记录。一旦你完成了这次全程旅行,你就可以开始看性能等了。第一步是让它发挥作用:)