CoreData - 访问关系时遇到问题

时间:2013-09-03 04:16:03

标签: objective-c core-data ios6

我的数据模型如下所示:

对象A< ----->>对象B< ----->对象C

我通过NSFetchedResultsController从Core Data中获取一组Object 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(entity:ObjectC; id:0xa9680b0; data :)

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

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

有什么建议吗?

更新:我尝试添加此内容:

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

但它没有任何区别。

1 个答案:

答案 0 :(得分:0)

  

问题是我无法解决对象C - I的错误   继续为myC得到这个:

     

$ 6 = 0x0a947c00(entity:ObjectC; id:0xa9680b0; data :)

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

  

故障处理是透明的 - 您不必执行提取   实现了一个错误。如果在某个阶段出现故障的持久性   访问对象,然后Core Data自动检索数据   对象并初始化对象(请参阅NSManagedObject类   引用不会导致错误的方法列表)。   这个过程通常被称为触发故障。

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

NSString *name = myC.name;

你应该发现myC的错误发生了,你自动拥有了一个可以使用的真实对象。

  

我能找到的所有线程都说错误是正常的   当你访问故障对象时它们会被触发,但那样   似乎没有发生在这里。

他们是对的。除非您还没有告诉我们,否则听起来您只是期望在不同时间触发故障,即当您将对象分配给myC时。但同样,这个错误不会发生,直到你对错误采取行动,比如获取或设置一个财产。