组合核心数据获取

时间:2013-07-08 05:17:05

标签: core-data entity-relationship nspredicate

我有两种类型的实体:SubjectCorrespondent s。他们通过多对多的关系彼此相关。我希望有一个fetchRequest我可以传递给NSFetchedResultsController,它会让它返回:

  1. 具有多个subject的所有correspondent
  2. 所有correspondentsubject只有Subject只有它们的一部分。
  3. 在尝试了各种各样的事情后,我认为不可能进行单次提取,同时返回CorrespondentFolder s,所以我转向StackOverflow并发现有人建议你拥有一个实体,它只会与您想要返回的两个实体建立关系。

    所以我创建了第三种类型的实体,我称之为Subject,每种实体都与CorrespondenthasCorrespondent具有可选的一对一关系。它还有两个属性hasSubjectSubject,它们是布尔值,可以跟踪CorrespondentFolder是否已设置。

    所以我写了这个谓词,它返回(hasCorrespondent == 1 AND ANY correspondent.subjects.correspondents.@count == 1) OR (hasSubject == 1 AND subject.correspondents.@count >= 1) 个实体:

    Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: 'Unsupported function expression count:(correspondent.subjects.correspondents)
    

    这个问题是我收到了一个错误:

    SUBQUERY(correspondent.subjects, $s, $s.correspondents.@count == 1).@count > 0
    

    那么,关于我做错了什么的任何建议?我怎样才能完成我想要的东西?我应该分享一些额外的细节吗?


    更新

    根据马丁的建议,我将违规部分更改为:

    Keypath containing KVC aggregate where there shouldn't be one;
    failed to handle $s.correspondents.@count
    

    但是这产生了一个新的错误:

    correspondent.subjects.@count > 0 AND
    SUBQUERY(correspondent.subjects, $s, $s.correspondents.@count == 1).@count > 0
    

    在谷歌搜索后,我发现建议添加一个检查,枚举的集合至少有一个对象,但修改违规行并没有改变我的错误消息(所以我可以告诉它无):

    {{1}}

2 个答案:

答案 0 :(得分:0)

这项工作并不理想,但它似乎完成了工作: 1 - 我在主题中添加了一个名为count的属性。 2 - 我将表达式(部分)设置为     任何通讯员.subjects.count == 1 请注意,此变通办法不需要SUBQUERY()。 3 - 每当我修改主题的通讯员时,我都会跑     subject.count = @(subject.correspondents.count);

我仍然希望有更好的解决方案,并乐意将任何(工作)更好的解决方案标记为正确。

答案 1 :(得分:0)

我有类似的问题。我创建了一个额外的字段 countSubentity 。当添加/删除子实体更改此字段时。而谓词看起来:

  

[NSPredicate predicateWithFormat:@" SUBQUERY(子类别,$ s,   $ s.countSubentity> 0)。@ count> 0"];