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

我有 3 个实体:

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

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

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

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

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

【问题讨论】:

    标签: ios core-data nspredicate nsfetchrequest


    【解决方案1】:

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

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

    【讨论】:

    • 我试过这个,但它不允许我将它作为 fetchrequest 的谓词传递。我收到一个错误(这似乎是已知的:stackoverflow.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?显然我可以使用数组手动完成,但是我失去了更新通知等的好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多