0

我有两种类型的实体:Subjects 和Correspondents。它们都通过一对多关系相互关联。我想要一个fetchRequest可以传递给它的单曲,NSFetchedResultsController它会返回:

  1. subject具有多个 的所有s correspondent
  2. 所有correspondent具有subjects 的 s 仅属于它们。

在尝试了各种各样的事情之后,我认为不可能进行一次同时返回Subjects 和Correspondents 的 fetch,所以我转向 StackOverflow 并发现其他人建议您有一个实体,它除了与您要返回的两个实体。

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

所以我写了这个返回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)

那么,关于我做错了什么有什么建议吗?我怎样才能完成我想要的?我应该分享任何其他细节吗?


更新

根据 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

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

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

2 回答 2

0

这项工作不太理想,但似乎完成了工作: 1 - 我向主题添加了一个名为 count 的属性。2 - 我将(部分)我的表达式设置为 ANY associate.subjects.count == 1 请注意,此解决方法不需要 SUBQUERY()。3 - 每次我修改主题的通讯员集时,我都会运行 subject.count = @(subject.correspondents.count);

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

于 2013-07-09T11:09:59.530 回答
0

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

[NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, $s.countSubentity > 0).@count > 0"];

于 2014-09-05T10:16:48.300 回答