CoreData - 访问关系的麻烦

Posted

技术标签:

【中文标题】CoreData - 访问关系的麻烦【英文标题】:CoreData - trouble accessing relationships 【发布时间】:2013-09-03 04:16:03 【问题描述】:

我的数据模型如下所示:

对象 A > 对象 B 对象 C

我通过 NSFetchedResultsController 从 Core Data 获取一组对象 A。对于该组中的一个特定对象,我知道它只有一个与之相关的对象 B,我想检索对象 C。

我正在尝试这样做:

NSArray *bArray = [objectA.relationA allObjects];
ObjectB *myB = bArray[0];
ObjectC *myC = myB.relationB;
(I've also tried [myB valueForKey:@"relationB"] with the same result)

问题是我无法为对象 C 触发错误 - 我一直在为 myC 获取此错误:

$6 = 0x0a947c00(实体:ObjectC;id:0xa9680b0;数据:)

我正在将此值传递给另一个视图控制器,但在那里访问它时仍然是一个错误,这并不是非常有用。

当我有对象时必须重新获取似乎很愚蠢,但我不知道还能做什么。我能找到的所有线程都说故障是正常的,当您访问故障对象时它们会被触发,但这里似乎没有发生。

有什么建议吗?

更新:我尝试添加这个:

[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"relationA.relationB"]];

但这并没有什么不同。

【问题讨论】:

【参考方案1】:

问题是我无法为对象 C 触发故障 - 我 继续为 myC 获取此内容:

$6 = 0x0a947c00(实体:ObjectC;id:0xa9680b0;数据:)

您还没有尝试访问myCmyC 在您以某种方式使用它之前将一直是一个错误。来自the docs:

故障处理是透明的——您不必执行获取 意识到一个错误。如果在某个阶段存在故障的持久属性 对象被访问,然后 Core Data 自动检索数据 对象并初始化对象(参见 NSManagedObject 类 参考不会导致故障触发的方法列表)。 此过程通常称为触发故障。

因此,(假设 ObjectC 具有 name 属性)如果您执行以下操作:

NSString *name = myC.name;

您应该会发现myC 处的故障已触发,您将自动拥有一个真实的对象可以使用。

我能找到的所有线程都说故障是正常的,而且 当您访问故障对象时,它们将被触发,但是 这里似乎没有发生。

他们是对的。除非您还没有告诉我们更多信息,否则听起来您只是希望故障在不同的时间触发,即当您将对象分配给 myC 时。但是同样,除非您对故障进行某些操作,例如获取或设置属性,否则故障不会触发。

【讨论】:

我试过了,它似乎大部分时间都可以工作,但是在访问 myC 时我仍然遇到这个错误:“CoreData: error: NULL _cd_rawData but the object is not being turn into a fault”总是有新东西要学…… 有一些关于该错误in a question of the same name 的信息。听起来您正试图在与拥有故障的上下文无关的线程中触发故障。如果您必须在不同的线程中使用故障,请考虑仅传递objectID,然后使用上下文的-objectWithID: 方法在目标线程的上下文中获取对象。或者也许我读得太多了……

以上是关于CoreData - 访问关系的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图 SDK - 核心数据

CoreData:通过关系访问对象

Cocoa:CoreData - ManagedObjectContext 中的多个实体

访问 CoreData 关系

CoreData 实体和属性之间的关系

无法使用 Swift 在 CoreData 中访问一对多关系