Core data 组合核心数据获取

Core data 组合核心数据获取,core-data,entity-relationship,nspredicate,Core Data,Entity Relationship,Nspredicate,我有两种类型的实体:主体s和对应者s。他们都通过一对多的关系相互关联。我想要一个fetchRequest,我可以将它传递给NSFetchedResultsController,它将返回: 所有具有多个对应对象的主题 所有的对应者s都有主题s,只有他们是其中的一部分 在尝试了各种方法之后,我决定不可能进行一次同时返回主题s和对应者s的获取,所以我转向StackOverflow,发现另一个人建议你有一个单独的实体,它只与你想要返回的两个实体有关系 因此,我创建了第三种类型的实体,我称之为文件夹s,每

我有两种类型的实体:
主体
s和
对应者
s。他们都通过一对多的关系相互关联。我想要一个
fetchRequest
,我可以将它传递给
NSFetchedResultsController
,它将返回:

  • 所有具有多个
    对应对象的
    主题
  • 所有的
    对应者
    s都有
    主题
    s,只有他们是其中的一部分
  • 在尝试了各种方法之后,我决定不可能进行一次同时返回
    主题
    s和
    对应者
    s的获取,所以我转向StackOverflow,发现另一个人建议你有一个单独的实体,它只与你想要返回的两个实体有关系

    因此,我创建了第三种类型的实体,我称之为
    文件夹
    s,每个实体都与
    主题
    对应者
    有可选的一对一关系。它还有两个属性,
    hasaresponder
    hasSubject
    ,它们是布尔值,用于跟踪是设置了
    Subject
    还是
    responder

    所以我写了这个谓词,它返回
    文件夹
    实体:

    (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)
    
    那么,关于我做得不对有什么建议吗?我怎样才能实现我想要的?有什么其他的细节我应该分享吗


    更新

    根据Martin的建议,我将冒犯部分改为:

    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
    
    在谷歌搜索之后,我发现了一些建议,可以添加一个检查,检查被枚举的集合是否至少有一个对象,但将有问题的行修改为该行并没有改变我的错误消息(据我所知,它什么也没有做):


    这项工作并不理想,但似乎已经完成了: 1-我向主题添加了一个名为count的属性。 2-我将(部分)表达式设置为 任意对应的.subjects.count==1 请注意,此解决方案不需要子查询()。 3-每次我修改一个主题的对应者集时,我都会运行 subject.count=@(subject.responders.count)


    我仍然希望有一个更好的解决方案,并将很高兴将任何(有效的)更好的解决方案标记为正确。

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

    [NSPredicate谓词格式:@“子查询(子类别,$s, $s.countSubentity>0)。@count>0“]


    我发现的所有东西都在说,这个错误与使用排序描述符有关,但这是一个获取,而不是排序…不幸的是,我的答案不起作用,我无法找到修复它的方法。无论如何,感谢您的尝试。
    correspondent.subjects.@count > 0 AND
    SUBQUERY(correspondent.subjects, $s, $s.correspondents.@count == 1).@count > 0