executeFetchRequest:error:每次都返回相同的对象实例吗?

时间:2015-05-22 06:59:52

标签: ios objective-c core-data

我是core data的新手并且有一个查询。

如果我调用executeFetchRequest:error:从上下文中检索实体,并将此实体存储在名为A的变量中,并重复该过程并在下次将其存储在名为B的变量中时,将A和B引用NSManagedObject的相同实例,即对对象A的更改是否也会对对象B进行?

此外,假设我继续从托管对象上下文中删除实体,这些引用会发生什么?

3 个答案:

答案 0 :(得分:1)

查看Faulting and Uniquing上的核心数据编程指南部分。引用:

  

Uniquing确保每个上下文每个记录单个管理对象

     

核心数据确保在给定的托管对象上下文中 - 持久性存储中的条目仅与一个托管对象相关联。该技术被称为uniquing。如果没有统一,您最终可能会得到一个上下文来维护多个对象来表示给定的记录。

因此,如果您在同一个上下文中执行提取,则返回的结果将指向相同的实例。

当您删除某个对象时,它会被标记为删除,直到下一次保存操作,此时它将从商店中删除。如果您之后保留对它的引用,CoreData将在您尝试访问它时抛出错误。在同一文档中,有关创建和删除对象的部分:

  

您可以通过向托管对象发送isDeleted消息来确定托管对象是否已被标记为删除。如果返回值为YES,这意味着在下一次保存操作期间将删除该对象,或者换句话说,该对象被标记为已删除当前(待处理)事务。

答案 1 :(得分:0)

每次获取对象时,您都会获得不同的实例。要检查是否表示相同的对象,您应该比较objectID属性(以检查它们是否指向持久存储中的同一记录)。 如果从上下文中删除一个,则可以使用existingObjectWithId检查另一个是否在上下文中:错误

答案 2 :(得分:0)

NSManagedObject子类由NSManagedContext自己创建和处理。这意味着当您获取更多时间时,可能会获得NSManagedObject的相同实例(但您不确定)。如果你想比较2个对象,你应该使用一些“isEqualTo:”实现。

在该上下文中删除对象时,将删除属性的内容。这意味着如果它们很弱,它们将被设置为nil,或者如果它们是字符串,它们将指向释放的内存。因此,当您尝试通过您的属性访问它时,应用程序崩溃可能会发生(我已经体验过:))。