如何取消删除Core Data中标记为删除的托管对象?

时间:2012-06-10 19:52:22

标签: core-data synchronization

在Core Data中创建托管对象:

NSManagedObject *aManagedObject = [NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:aContext];

要删除托管对象,请将消息发送到其托管对象上下文。

[aContext deleteObject:aManagedObject];

该方法向aManagedObject发送消息

- (void)prepareForDeletion

这是我的问题。我正在将此数据与外部数据库同步。我有一个名为“已删除”的属性。当一个对象首次被“删除”时,我想将“deleted”属性设置为YES,然后将其同步到删除它的外部数据库。在将来某个日期,所有“已删除”== YES实体将过期并真正删除。

在prepareForDeletion中我想测试是否:

  • dateSynced> = dateModified
  • dateSynced< = expirationDate
  • “已删除”==是

并真正删除对象,否则:

  • dateModified =现在
  • “已删除”=是
  • 并将其删除

有没有办法让它在此时不被删除?

或者,我是否应该尝试使用prepareForDeletion覆盖deleteObject并只创建一个新方法,例如obsoleteObject来设置“deleted”= YES和dateModified = Now并且稍后只使用deleteObject进行清除?

3 个答案:

答案 0 :(得分:1)

我最近实施了这样一种机制。

一旦标记为已删除,您就无法延迟实体删除。它将在下次保存上下文时删除。你必须依靠别的东西来保持同步。

这是我的解决方案。我创建了一个持久的事件日志,其中一些是删除事件。当一个实体被标记为已删除时,我会创建一个相应的日志条目(实际上在另一个上下文中,在删除对象的上下文之前保存,以确保日志条目是最新的并在执行实际删除之前保存)。稍后处理日志,并向服务器发出删除命令。如果保存了日志但删除的实体从未因崩溃而被删除,则下次启动应用程序时,将处理日志,同时在本地和远程删除实体,一切都很顺利。

听起来很复杂,但实际上并没有。

答案 1 :(得分:0)

我想,你不能这样做。我这样做了 - 在对象删除时我存储了它的对象id(在我的情况下它是guid存储为文件)并且在同步时我将删除推送到服务器。

答案 2 :(得分:0)

建议这样做,但有一种方法可以从Core Data“取消删除”对象。这可能不是你想要的。

只需使用要取消删除的对象调用insert(object)即可。如果对象删除未保存在上下文中,则必须先调用processPendingChanges()

重要:取消删除后,您还必须设置对象的所有属性,并取消删除处理待处理更改时可能已应用的所有级联删除(或者上下文已被保存。)

请记住这是一件危险的事情!你应该避免这样做。

我在iOS 10上保存之前测试了取消删除。