假设我有一个名为Player
的CoreData实体类型,并且它与一个名为purpose
的实体类型具有一对一的关系(PlayerPurpose
)。为了完整起见,请假设我们在PlayerPurpose
中有一个名为parentPlayer
的反比关系。请考虑以下快速代码:
// Assume we already have a player object in a NSManagedObjectContext called context:
player.purpose = NSEntityDescription.insertNewObjectForEntityForName("PlayerPurpose",
inManagedObjectContext: context) as PlayerPurpose;
// Later in the code, we set the value to nil (or we could have replaced
// it with another call to insertNewObjectForEntityForName)
player.purpose = nil;
// What happens to the previous playerPurpose object within the Managed Object Context?
我的问题:当托管对象上下文中的唯一引用设置为nil(或替换为另一个对象)时,托管对象上下文中的原始playerPurpose对象会发生什么?
这与关系删除规则无关,因为我没有明确删除任何对象 - 我将其从任何有意义的关系中移除,使其成为孤儿。
从ARC的角度来看(如果PlayerPurpose只是一个普通的非托管对象),原始的PlayerPurpose实例现在没有引用,因此它可以从内存中清除 - 但是在托管对象上下文中会发生什么? CoreData是否将其识别为孤立对象并通过上下文删除它?
如果没有,那么我假设我必须小心删除通过上下文创建的任何托管对象,如果我要删除所有对它的引用。假设是这种情况,是否有一个好的模式用于确保孤立对象从NSManagedObjectContext中清除,并且它们不再存储在持久存储中?
谢谢!
答案 0 :(得分:4)
核心数据不会自动删除此方案中的对象,因为"孤立的"是您的代码所具有的概念,而不是Core Data可识别的概念。没有理由删除PlayerPurpose
对象只是因为它的一个关系是零。
确保删除PlayerPurpose
个实例的最可靠方法是
NSManagedObject
子类(如果您还没有这些子类)。purpose
子类上Player
的setter方法。如果新值为nil,则删除旧值。您也可以通过确保在适当的时间致电deleteObject:
来解决这个问题。或者,您可以执行清理步骤,在其中使用PlayerPurpose
的nil值获取每个parentPlayer
并删除它们。