ios - iOS CoreData 中的孤立对象

标签 ios core-data swift

假设我有一个名为 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 实例的最可靠方法是

  1. 为您的实体创建自定义 NSManagedObject 子类(如果您还没有)。
  2. Player 子类上重写 setter 方法以实现目的。如果新值为零,则删除旧值。

您还可以通过确保在适当的时间调用 deleteObject: 来处理此问题。或者,您可以运行清理步骤,获取 parentPlayer 值为 nil 的每个 PlayerPurpose 并将其删除。

关于ios - iOS CoreData 中的孤立对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965730/

相关文章:

ios - UITextView 不会旋转

iphone - iPhone/iPad内存问题(不泄漏)

Swift: boolean 属性和 KVC 之谜

core-data - 如何为 CoreData 编写 NSPredicate 一对多关系

ios - 如何将对象添加到 NSPointerArray?

ios - 从两个应用程序访问共享数据

ios - scrollView 在 View 之间滑动

objective-c - Objective-C : Displaying Array Elements

ios - 在 Interface Builder 中设置 UIToolbar 的位置

ios - 存储在核心数据中时是否必须存储两个实体数据?