【问题标题】:What's the difference between -existingObjectWithID:error: and –objectWithID:?-existingObjectWithID:error: 和 –objectWithID: 之间有什么区别?
【发布时间】:2011-03-01 16:30:17
【问题描述】:

-existingObjectWithID:error:–objectWithID: 有什么区别?

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    objectWithID: 假定对象存在,因此如果您给它一个错误的 ID,当您尝试访问返回实体的属性时,它将引发异常。此外,此方法始终返回一个实体。

    existingObjectWithID:error: 将返回一个对象,如果它存在,nil 如果它不存在。如果有错误,它将填充错误指针。

    【讨论】:

    • 我试过 objectWithID: 它没有抛出任何异常。见stackoverflow.com/questions/3013194/…
    • 你的回答不太对。 objectWithID: 不会抛出异常。它可能会返回错误,这可能会引发异常。
    【解决方案2】:

    我相信existingObjectWithID:error: 只有在它已经注册到接收上下文时才会返回一个实例。 objectWithID: 可能会为尚未注册(拉入)接收上下文的对象返回错误。

    【讨论】:

    • 文档实际上表明如果对象不在当前上下文中,existingObjectWithID:error: 将查询持久存储。只有当它找不到对象时才会出错。这是获取现有对象的最明确的方法,而objectWithID: 不关心对象是否存在,objectRegisteredWithID: 要求对象已经加载到上下文中。
    【解决方案3】:

    existingObjectWithID:error: 将返回已注册的对象——也就是说,它是在此 NSManagedObjectContext 中创建的,或已被获取(或使用 objectWithID: 检索)。否则它将返回nil。此方法无法找到数据存储中但从未被此上下文检索过的托管对象。如果此方法获得错误 id 或已删除对象的 id,则此方法永远不会抛出异常。

    objectWithID: 可能会在数据存储中但尚未检索到的托管对象发生故障 - 现在它将被注册并可以访问。如果 objectID 错误或对象已被删除,则会引发异常。

    重要的是要注意对象 id WILL CHANGE 在第一次保存时(从临时 id 到永久 id),所以不要期望创建对象,保留对其原始的引用id 然后在保存后使用该 id 检索它。您可以致电isTemporaryID查看保存后对象id是否会发生变化。

    【讨论】:

    • 如果您在子上下文中并且对象已在父上下文中注册,该怎么办。子上的 ExistingObjectWithID 将通过父级返回,即使子上下文尚未注册此对象。对吗?
    • 声明:“此方法无法找到位于数据存储区但从未被此上下文检索过的托管对象。”是假的。 existingObjectWithID:error: 在上下文中查找对象,如果找不到,它将在上下文的父上下文(以及该上下文的父上下文等)或上下文的持久存储中查找,直到找到为止。如果找到它,它会将其放入上下文中并返回它。如果找不到,则返回nil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2018-12-23
    • 2010-11-07
    • 2014-07-20
    • 2013-02-20
    • 2012-01-01
    相关资源
    最近更新 更多