Iphone 核心数据同步-跟踪已删除的对象
我正在为我正在开发的iPad应用程序设置一个基本的同步服务。目标是在iPad应用程序的多个实例中保持数据一致,并在web上提供只读版本的数据,从而推出定制解决方案 当前的流程如下所示:Iphone 核心数据同步-跟踪已删除的对象,iphone,mysql,ios,ipad,core-data,Iphone,Mysql,Ios,Ipad,Core Data,我正在为我正在开发的iPad应用程序设置一个基本的同步服务。目标是在iPad应用程序的多个实例中保持数据一致,并在web上提供只读版本的数据,从而推出定制解决方案 当前的流程如下所示: 每个实体都有一个“已创建”、“已修改”和“UUID”字段,由核心数据自动更新 在同步时,在最后一个同步日期之后创建或修改日期的每个实体被序列化为JSON并发送到服务器 服务器使用客户端生成的UUID作为PKs来持久化对MySQL数据库的任何更改(如果存在冲突,它只使用最近修改的实体作为“真实”版本,没有什么特别
- 每个实体都有一个“已创建”、“已修改”和“UUID”字段,由核心数据自动更新
- 在同步时,在最后一个同步日期之后创建或修改日期的每个实体被序列化为JSON并发送到服务器
- 服务器使用客户端生成的UUID作为PKs来持久化对MySQL数据库的任何更改(如果存在冲突,它只使用最近修改的实体作为“真实”版本,没有什么特别之处),并将任何更新的实体发回客户端
- 然后,客户机将这些更改合并回其核心数据库
- 我是否可以覆盖Core Data的删除方法以自动设置此标志
- 这是否需要在服务器上无限期地保留所有已删除的实体?我们无法知道每个客户端何时已同步并实际删除了每个实体(我目前不跟踪客户端实例)
- 有更好的方法吗
关于你的第二个问题,我给你2美分:如果你想的话,你可以设计它,这样服务器就不必保留被删除的记录。让每个应用知道服务器上是否存储了给定的数据(基于其UUID)(例如,添加existsOnServer属性或类似属性)。当在应用程序中创建一个新项目时,此选项开始为false,但在第一次将其同步到服务器后设置为true。这样,如果应用程序稍后尝试同步,但未找到UUID,则可以区分两种情况:如果existsOnServer为false,则此项是新创建的,应同步到服务器,但如果为true,则可以认为它以前已在服务器上,但现在已被删除,所以你也可以在应用程序中删除它
我可能会反对这种方法,因为它对我来说更容易出错(我认为数据库或连接错误被错误地解释为删除),在服务器上保留记录通常不是什么大事,但这是可能的。dzeikei建议的“增量方法”可以同时使用,因此对服务器上不存在的记录进行更新表示该记录已被删除,而插入则表示该记录未被删除。是否必须将删除的对象保留在服务器上完全取决于您的需要。您将需要一个本地已删除标志来标记为已删除以进行同步,可能还需要在服务器上标记为已删除,具体取决于您是否希望回滚 我以前处理过这个问题。这里有一种可能性: 当客户端删除某些内容时,只需将其标记为在本地删除,并在同步期间从服务器中删除(此时您可以从核心数据中清除)。当其他客户端请求访问该数据时,发送回HTTP 404,因为您不再拥有该对象。此时,客户端可以在本地删除实体。现在,如果客户机请求一个事物列表,并且这个对象已经被删除,那么它将从他得到的事物列表中丢失,这样您就可以检测到它并将其删除。在客户机中,当我从服务器得到响应时,我创建一个对象ID数组,并删除任何没有这些ID的本地对象 我们在服务器上有一个已删除字段,但只是为了能够在意外删除某些内容时回滚 当然,您可以将已删除的对象返回给客户端,以便它们知道要删除,但如果您不想在服务器上保留副本,则必须假设客户端将在一个时间范围内全部更新。然后,您可以在该时限到期后进行垃圾收集 不过,我不太喜欢这个解决方案。如果数据太重,无法要求所有对象进行完全同步,则可以使用当前的合并策略创建和更新,然后运行单独的调用以检查删除的项目。该调用可以简单地要求客户端在设备上拥有所有ID。它可以删除那些不存在的。或者它可以发送客户端上的所有ID,并返回要删除的ID列表 我认为,如果你想要一个更为固执己见的建议,你必须提供更多关于数据性质的细节。如果你没有,你可以看一看。这是一篇关于同步和iOS的非常好的论文 关于你的问题: