核心数据获取与另一个对象关系的对象

14 iphone cocoa core-data objective-c

我想获取与对象A具有多对多关系的对象B(即A - >> B).我已经记忆中有A. 我知道我可以从A中获取B对象的NSSet,但最好是对B对象进行获取请求(特别是如果我想在UITableView中按日期排序)?

我如何才能提出只获得属于单个对象A的B对象的请求?

Jim*_*eia 6

如果您已经拥有A的实例,只需通过A的访问者访问相关的B实例.

如果你需要直接获取与特定A相关的所有B(在这种情况下你不是),你将为B实体构建一个获取请求,其中一个谓词基于Bs与A的(反向)关系.(具体语法将取决于反向关系名称,以及该反转是一对一还是多对.)


mmc*_*mmc 5

您必须在B类中指定反向关系才能完成您的要求.

但是,我不确定你为什么要反对(没有双关语)来抓取已经在对象A中的B对象集.即使对象本身是延迟加载的,因为你已经在内存中有A,我有预感(虽然专家需要验证)从A中获取集合比指定新的NSPredicate更有效,并创建一个全新的Fetch.

当然,通过"更高效"我们谈论毫秒,即使在像iPhone一样慢的设备上也是如此.我从对象A抓取集合,因为语法更清晰.它也可能更快的事实是奖金.


Luk*_*etr 5

你需要在你的A的objectID中使用谓词,如下所示:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *BEntity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:moc];
[fetchRequest setEntity:BEntity];

NSPredicate *predicate = [NSPredicate 
predicateWithFormat:@"(relationship_to_a = %@)", [yourAInstance objectID]];

[fetchRequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

其中relationship_to_a是B管理对象中与A的关系的名称.

希望这可以帮助.

顺便说一句:对于那些建议使用关系集中的错误的其他答案:我自己尝试了这个,并且它比获取它们慢得多,因为Core Data显然会一个接一个地(不是批处理)触发故障,因此,对于较大的套装来说,它会变得非常慢

实际上,如果你通过提取得到你的A实例,那么你可以尝试将NSFetchRequest中的relationshipKeyPathsForPrefetching 设置 为YES,然后关系中的所有对象都不应该是错误.但这对我不起作用,所以我坚持使用'获取解决方案'.