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;数据:)
您还没有尝试访问myC
。 myC
在您以某种方式使用它之前将一直是一个错误。来自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 - 访问关系的麻烦的主要内容,如果未能解决你的问题,请参考以下文章