假设我有一个名为 Player
的 CoreData 实体类型,它与名为 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?
我的问题:当托管对象上下文中原始的playerPurpose对象在数据中拥有的唯一引用被设置为nil(或替换为另一个对象)时,它会发生什么?
这与关系删除规则并不真正相关,因为我没有显式删除任何对象 - 我将其从任何有意义的关系中删除,使其成为孤儿。
从 ARC 角度来看(如果 PlayerPurpose 只是一个普通的非托管对象),原始 PlayerPurpose 实例现在没有引用,因此可以从内存中清除它 - 但托管对象上下文中会发生什么? CoreData 是否将其识别为孤立对象并通过上下文将其删除?
如果不是,那么我认为如果我要删除对它的所有引用,我必须小心删除通过上下文创建的任何托管对象。假设是这种情况,是否有一个好的模式可以用来确保孤立对象从 NSManagedObjectContext 中清除并且它们不再存储在持久存储中?
谢谢!
最佳答案
在这种情况下,Core Data 不会自动删除对象,因为“孤立”是您的代码中存在的概念,但 Core Data 无法识别。它没有理由仅仅因为一个 PlayerPurpose
对象的关系为零而删除它。
确保删除 PlayerPurpose
实例的最可靠方法是
- 为您的实体创建自定义
NSManagedObject
子类(如果您还没有)。 - 在
Player
子类上重写 setter 方法以实现目的
。如果新值为零,则删除旧值。
您还可以通过确保在适当的时间调用 deleteObject:
来处理此问题。或者,您可以运行清理步骤,获取 parentPlayer
值为 nil 的每个 PlayerPurpose
并将其删除。
关于ios - iOS CoreData 中的孤立对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965730/