CoreData 获取请求 - 获取所有有关系的对象

Posted

技术标签:

【中文标题】CoreData 获取请求 - 获取所有有关系的对象【英文标题】:CoreData fetch request - fetching all objects which have relationship 【发布时间】:2013-06-10 16:29:07 【问题描述】:

我有 3 个实体:

Topic <--->> subTopic <--->> Certificate.

我想要的是所有主题的列表,其中存在证书(没有重复)。根据我最初的阅读(主要是这个问题:CoreData performance: predicate on more to-many relationships),我发现最有效的方法(假设可能)是从证书级别开始,并从证书列表中导出主题列表。

但这就是我所得到的。我如何指定虽然我想要一个主题列表,但我想要的列表将基于所有证书?是否可以为可以返回主题列表的 fetchrequest 指定谓词。

有没有一种方法可以做到这一点,而无需手动跟踪每个证书的关系并将找到的主题添加到 NSSet 或其他东西?

感谢任何指点(或同样 - 建议告诉我不要再傻了,这就是我应该这样做的方式!)

【问题讨论】:

【参考方案1】:

我目前无法对此进行测试,但是使用此谓词对主题实体的获取请求应该可以工作:

[NSPredicate predicateWithFormat:@"SUBQUERY(subtopics, $s, ANY $s.certificates != NULL).@count > 0"]

【讨论】:

我试过这个,但它不允许我将它作为 fetchrequest 的谓词传递。我收到一个错误(这似乎是已知的:***.com/questions/10762539/…)Keypath containing KVC aggregate where there shouldn't be one; failed to handle $s.certificates.@count' @Matt:我已经更新了谓词,它不再崩溃并且似乎获取了正确的对象。 - 如果您想在获取的结果控制器中使用它,那么您应该记住 FRC 仅跟踪对获取的实体主题本身的更改,因此添加或删除子主题将触发更新通知,但添加或删除证书将不是。这对你来说是个问题吗? 谢谢!一分钟后我会试试看。这将是最有趣的证书更新,但它们不太可能在显示 tableView 时发生,所以我想这不会是一个大问题! 我已将此标记为已接受,因为它确实做了必要的事情!就像你说的,添加证书不会触发更新,这不是一个大问题,因为更新发生的方式,fetchedRequestController 实际上并没有做那么多!谢谢!!【参考方案2】:

随心所欲地获取所有类别,不需要谓词,因为您想要所有类别。然后得到这样的主题(假设合理的关系名称):

NSArray *topics = [[categories valueForKeyPath:@"@distinctUnionOfObjects.subtopic"] valueForKeyPath:@"@distinctUnionOfObjectstopic"];

【讨论】:

这很好用 - 谢谢!无论如何我可以将其作为 NSPredicate 执行,以便将其提供给 fetchedResultsController?显然我可以使用数组手动完成,但是我失去了更新通知等的好处。

以上是关于CoreData 获取请求 - 获取所有有关系的对象的主要内容,如果未能解决你的问题,请参考以下文章

获取与 NSFetchedResultsController 有关系的对象

在Doctrine中插入有关系的记录后获取ID

如何在 segue 中从 CoreData 获取结果

coredata获取请求中的日期比较?

CoreData 获取请求 NSPredicate 不起作用

iphone coredata 获取请求排序