我有两种类型的实体:Subject
和Correspondent
s。他们通过多对多的关系彼此相关。我希望有一个fetchRequest
我可以传递给NSFetchedResultsController
,它会让它返回:
subject
的所有correspondent
。correspondent
个subject
只有Subject
只有它们的一部分。在尝试了各种各样的事情后,我认为不可能进行单次提取,同时返回Correspondent
和Folder
s,所以我转向StackOverflow并发现有人建议你拥有一个实体,它只会与您想要返回的两个实体建立关系。
所以我创建了第三种类型的实体,我称之为Subject
,每种实体都与Correspondent
和hasCorrespondent
具有可选的一对一关系。它还有两个属性hasSubject
和Subject
,它们是布尔值,可以跟踪Correspondent
或Folder
是否已设置。
所以我写了这个谓词,它返回(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}}
答案 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"];