【发布时间】:2011-03-01 16:30:17
【问题描述】:
-existingObjectWithID:error: 和 –objectWithID: 有什么区别?
【问题讨论】:
-existingObjectWithID:error: 和 –objectWithID: 有什么区别?
【问题讨论】:
objectWithID: 假定对象存在,因此如果您给它一个错误的 ID,当您尝试访问返回实体的属性时,它将引发异常。此外,此方法始终返回一个实体。
existingObjectWithID:error: 将返回一个对象,如果它存在,nil 如果它不存在。如果有错误,它将填充错误指针。
【讨论】:
objectWithID: 不会抛出异常。它可能会返回错误,这可能会引发异常。
我相信existingObjectWithID:error: 只有在它已经注册到接收上下文时才会返回一个实例。 objectWithID: 可能会为尚未注册(拉入)接收上下文的对象返回错误。
【讨论】:
existingObjectWithID:error: 将查询持久存储。只有当它找不到对象时才会出错。这是获取现有对象的最明确的方法,而objectWithID: 不关心对象是否存在,objectRegisteredWithID: 要求对象已经加载到上下文中。
existingObjectWithID:error: 将返回已注册的对象——也就是说,它是在此 NSManagedObjectContext 中创建的,或已被获取(或使用 objectWithID: 检索)。否则它将返回nil。此方法无法找到数据存储中但从未被此上下文检索过的托管对象。如果此方法获得错误 id 或已删除对象的 id,则此方法永远不会抛出异常。
objectWithID: 可能会在数据存储中但尚未检索到的托管对象发生故障 - 现在它将被注册并可以访问。如果 objectID 错误或对象已被删除,则会引发异常。
重要的是要注意对象 id WILL CHANGE 在第一次保存时(从临时 id 到永久 id),所以不要期望创建对象,保留对其原始的引用id 然后在保存后使用该 id 检索它。您可以致电isTemporaryID查看保存后对象id是否会发生变化。
【讨论】:
existingObjectWithID:error: 在上下文中查找对象,如果找不到,它将在上下文的父上下文(以及该上下文的父上下文等)或上下文的持久存储中查找,直到找到为止。如果找到它,它会将其放入上下文中并返回它。如果找不到,则返回nil。