在Core Data中创建托管对象:
NSManagedObject *aManagedObject = [NSEntityDescription
insertNewObjectForEntityForName:@"Employee"
inManagedObjectContext:aContext];
要删除托管对象,请将消息发送到其托管对象上下文。
[aContext deleteObject:aManagedObject];
该方法向aManagedObject发送消息
- (void)prepareForDeletion
这是我的问题。我正在将此数据与外部数据库同步。我有一个名为“已删除”的属性。当一个对象首次被“删除”时,我想将“deleted”属性设置为YES,然后将其同步到删除它的外部数据库。在将来某个日期,所有“已删除”== YES实体将过期并真正删除。
在prepareForDeletion中我想测试是否:
并真正删除对象,否则:
有没有办法让它在此时不被删除?
或者,我是否应该尝试使用prepareForDeletion覆盖deleteObject并只创建一个新方法,例如obsoleteObject来设置“deleted”= YES和dateModified = Now并且稍后只使用deleteObject进行清除?
答案 0 :(得分:1)
我最近实施了这样一种机制。
一旦标记为已删除,您就无法延迟实体删除。它将在下次保存上下文时删除。你必须依靠别的东西来保持同步。
这是我的解决方案。我创建了一个持久的事件日志,其中一些是删除事件。当一个实体被标记为已删除时,我会创建一个相应的日志条目(实际上在另一个上下文中,在删除对象的上下文之前保存,以确保日志条目是最新的并在执行实际删除之前保存)。稍后处理日志,并向服务器发出删除命令。如果保存了日志但删除的实体从未因崩溃而被删除,则下次启动应用程序时,将处理日志,同时在本地和远程删除实体,一切都很顺利。
听起来很复杂,但实际上并没有。
答案 1 :(得分:0)
我想,你不能这样做。我这样做了 - 在对象删除时我存储了它的对象id(在我的情况下它是guid存储为文件)并且在同步时我将删除推送到服务器。
答案 2 :(得分:0)
我不建议这样做,但有一种方法可以从Core Data“取消删除”对象。这可能不是你想要的。
只需使用要取消删除的对象调用insert(object)
即可。如果对象删除未保存在上下文中,则必须先调用processPendingChanges()
。
重要:取消删除后,您还必须设置对象的所有属性,并取消删除处理待处理更改时可能已应用的所有级联删除(或者上下文已被保存。)
请记住这是一件危险的事情!你应该避免这样做。
我在iOS 10上保存之前测试了取消删除。