核心数据不保存已删除的关系

时间:2009-12-09 16:50:34

标签: iphone objective-c core-data orm

我在Core Data中有一个“to->很多”关系,没有反向关系,并且删除规则设置为“Nullify”和“No action”(我的意思是我试过两个都没有用)

基本上我有一个MergedStation,其属性subStations指向许多Station对象:MergedStation.subStation - >>站

当我调用[mergedStation addSubStationsObject:newStation];(动态创建)时,一切都运行良好,添加了一个新工作站,所有内容都刷新并正确保存,以便下次打开程序时,一切正常。

但是,当我调用[mergedStation removeSubStationsObject:stationToRemove];(也是动态创建)时,所有内容仅对当前程序会话正确删除。如果我关闭程序并再次打开它,就好像我没有改变任何东西。我在添加和删除方法之后调用完全相同的方法:

[self.managedObjectContext refreshObject:station mergeChanges:YES];

[self.managedObjectContext processPendingChanges];

[self.managedObjectContext saveAndPrintErrors];

我也尝试过上述代码的不同组合以使其发挥作用。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:4)

目前还不清楚“只为当前的程序会话正确删除”是什么意思。删除规则指定删除关系源(MergedStation)时应发生的情况,而不是关系中断时发生的情况。删除关联不应删除任何实体实例。如果要删除子站,则必须使用-[NSManagedObjectContext deleteObject:]手动执行此操作。

另外,除非你有数百万个变电站(或OS X上的数十亿),否则你应该在管理对象模型中包含反向关系。核心数据是一个对象图管理框架,当所有关系都是双向的时,对象图管理最有效(最简单)。如果你包含逆数,核心数据将为你做很多繁重的工作。 不需要在代码中使用反转;如果你愿意,你可以忽略它。你支付的唯一罚款是一点点记忆。在你可以证明额外的内存使用对你的代码有害之前,你应该保持相反的关系。

答案 1 :(得分:1)

我有同样的问题。 “仅对当前程序会话正确删除”的含义是,如果在重新启动应用程序之前检查托管对象,则它处于您希望它处于的状态(在他的情况下,SubStation对象已从关系中删除)采集)。

我按建议添加了与数据模型的反比关系,并且一切都神奇地起作用。很高兴有工作,但我真的想知道是否有办法解决这个问题而不需要额外的内存惩罚。

答案 2 :(得分:0)

唉。我花了太多时间处理与此密切相关的问题。在我的情况下,我正在添加实体到多对多关系,并在重新启动我的应用程序后丢失这些更改。添加反向关系是解决问题的方法,但我不明白为什么。我的意思是,我明白为什么反向关系是一件好事,但如果单向关系像看起来一样无用,那么它们应该被强制要求或至少被Core Data默认。

感谢上面的Erik P为我提供了我需要的线索!添加这些反向关系!