Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据同步-跟踪已删除的对象_Iphone_Mysql_Ios_Ipad_Core Data - Fatal编程技术网

Iphone 核心数据同步-跟踪已删除的对象

Iphone 核心数据同步-跟踪已删除的对象,iphone,mysql,ios,ipad,core-data,Iphone,Mysql,Ios,Ipad,Core Data,我正在为我正在开发的iPad应用程序设置一个基本的同步服务。目标是在iPad应用程序的多个实例中保持数据一致,并在web上提供只读版本的数据,从而推出定制解决方案 当前的流程如下所示: 每个实体都有一个“已创建”、“已修改”和“UUID”字段,由核心数据自动更新 在同步时,在最后一个同步日期之后创建或修改日期的每个实体被序列化为JSON并发送到服务器 服务器使用客户端生成的UUID作为PKs来持久化对MySQL数据库的任何更改(如果存在冲突,它只使用最近修改的实体作为“真实”版本,没有什么特别

我正在为我正在开发的iPad应用程序设置一个基本的同步服务。目标是在iPad应用程序的多个实例中保持数据一致,并在web上提供只读版本的数据,从而推出定制解决方案

当前的流程如下所示:

  • 每个实体都有一个“已创建”、“已修改”和“UUID”字段,由核心数据自动更新
  • 在同步时,在最后一个同步日期之后创建或修改日期的每个实体被序列化为JSON并发送到服务器
  • 服务器使用客户端生成的UUID作为PKs来持久化对MySQL数据库的任何更改(如果存在冲突,它只使用最近修改的实体作为“真实”版本,没有什么特别之处),并将任何更新的实体发回客户端
  • 然后,客户机将这些更改合并回其核心数据库
这一切似乎都运作良好。我的问题是如何使用此方法跟踪已删除的对象?我猜我可以为每个实体添加一个“deleted”标志,并在客户机删除某些内容时设置该标志,然后我可以将该更改与其余的同步数据一起推送到服务器。同步完成后,客户端可以实际删除这些实体。我的问题是:

  • 我是否可以覆盖Core Data的删除方法以自动设置此标志
  • 这是否需要在服务器上无限期地保留所有已删除的实体?我们无法知道每个客户端何时已同步并实际删除了每个实体(我目前不跟踪客户端实例)
  • 有更好的方法吗

如何保存一个包含UUID和创建/更新/删除字段的增量历史记录表,可能每个更新都有一个修订号?因此,自上次成功同步以来,您保留了一个小的更改检查列表

这样,如果您删除了一个对象,您可以在delta历史表中添加一个带有已删除UUID的条目,并将其标记为已删除。与已创建和更新的对象相同,您只需检查增量表即可查看服务器需要删除、更新、创建的项目。您甚至可以将每个修订版存储在服务器上,以支持将来回滚到以前的版本(如果您愿意)

我认为修订号比依赖客户的时钟要好,因为客户的时钟可能会被手动更改

可以使用NSManagedObjectContext的insertedObjects、UpdateObjects和deletedObjects方法在每个保存过程之前创建增量对象:)


关于你的第二个问题,我给你2美分:如果你想的话,你可以设计它,这样服务器就不必保留被删除的记录。让每个应用知道服务器上是否存储了给定的数据(基于其UUID)(例如,添加existsOnServer属性或类似属性)。当在应用程序中创建一个新项目时,此选项开始为false,但在第一次将其同步到服务器后设置为true。这样,如果应用程序稍后尝试同步,但未找到UUID,则可以区分两种情况:如果existsOnServer为false,则此项是新创建的,应同步到服务器,但如果为true,则可以认为它以前已在服务器上,但现在已被删除,所以你也可以在应用程序中删除它


我可能会反对这种方法,因为它对我来说更容易出错(我认为数据库或连接错误被错误地解释为删除),在服务器上保留记录通常不是什么大事,但这是可能的。dzeikei建议的“增量方法”可以同时使用,因此对服务器上不存在的记录进行更新表示该记录已被删除,而插入则表示该记录未被删除。

是否必须将删除的对象保留在服务器上完全取决于您的需要。您将需要一个本地已删除标志来标记为已删除以进行同步,可能还需要在服务器上标记为已删除,具体取决于您是否希望回滚

我以前处理过这个问题。这里有一种可能性:

当客户端删除某些内容时,只需将其标记为在本地删除,并在同步期间从服务器中删除(此时您可以从核心数据中清除)。当其他客户端请求访问该数据时,发送回HTTP 404,因为您不再拥有该对象。此时,客户端可以在本地删除实体。现在,如果客户机请求一个事物列表,并且这个对象已经被删除,那么它将从他得到的事物列表中丢失,这样您就可以检测到它并将其删除。在客户机中,当我从服务器得到响应时,我创建一个对象ID数组,并删除任何没有这些ID的本地对象

我们在服务器上有一个已删除字段,但只是为了能够在意外删除某些内容时回滚

当然,您可以将已删除的对象返回给客户端,以便它们知道要删除,但如果您不想在服务器上保留副本,则必须假设客户端将在一个时间范围内全部更新。然后,您可以在该时限到期后进行垃圾收集

不过,我不太喜欢这个解决方案。如果数据太重,无法要求所有对象进行完全同步,则可以使用当前的合并策略创建和更新,然后运行单独的调用以检查删除的项目。该调用可以简单地要求客户端在设备上拥有所有ID。它可以删除那些不存在的。或者它可以发送客户端上的所有ID,并返回要删除的ID列表

我认为,如果你想要一个更为固执己见的建议,你必须提供更多关于数据性质的细节。

如果你没有,你可以看一看。这是一篇关于同步和iOS的非常好的论文

关于你的问题:

  • 您可以避免删除fil