2013-07-08 3 views
0

У меня есть два типа объектов: Subject s и Correspondent s. Они оба связаны друг с другом через отношения «многие». Я хочу иметь один fetchRequest, что я могу передать в NSFetchedResultsController, который будет иметь его вернуть:Combo Core Data Fetch

  1. Все из subject с, которые имеют более одного correspondent.
  2. Все correspondent s имеют subject с, что только они отделены друг от друга.

Перепробовав множество вещей, я решил, что это не возможно сделать один выборки, которая возвращает оба Subject с и Correspondent с, поэтому я обратился к StackOverflow и нашел кто-то предполагает, что у вас есть один объект, который делает не более чем отношения с двумя объектами, которые вы хотели бы вернуть.

Так что я создал третий тип объекта, который я назвал Folder с, каждый из которых имеет факультативное отношение к одному с Subject и Correspondent. Он также имеет два атрибута: hasCorrespondent и hasSubject, которые являются булевыми, отслеживая, установлены ли Subject или Correspondent.

Так что я написал этот предикат, который возвращает Folder сущности:

(hasCorrespondent == 1 AND ANY [email protected] == 1) 
OR 
(hasSubject == 1 AND [email protected] >= 1) 

Проблема с этим я получаю сообщение об ошибке:

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

Таким образом, любые предложения относительно того, что я m делать неправильно? Как я могу выполнить то, что мне нужно? Есть ли дополнительные сведения, которые я должен поделиться?


UPDATE

С предложением Мартина, я изменил часть обижая к этому:

SUBQUERY(correspondent.subjects, $s, [email protected] == 1)[email protected] > 0 

Но что породило новую ошибку:

Keypath containing KVC aggregate where there shouldn't be one; 
failed to handle [email protected] 

После прибегая к помощи вокруг , Я нашел предложения, чтобы добавить проверку, что колл прогиб быть перечислены в течение, по крайней мере, один объект, но изменяя обижая линию это не изменило мои сообщения об ошибках (так, насколько я могу сказать, что ничего не делал):

[email protected] > 0 AND 
SUBQUERY(correspondent.subjects, $s, [email protected] == 1)[email protected] > 0 
+0

Все, что я нашел твердит, что эта ошибка относится к использованию сортировки дескрипторов, но это выборка, а не своего рода ... – ArtOfWarfare

+1

К сожалению, мой ответ не работает, и я не мог понять способ его исправить. –

+0

Спасибо за попытку, в любом случае. – ArtOfWarfare

ответ

0

У меня была аналогичная проблема. Я создал дополнительное поле countSubentity. И когда add/remove subentity измените это поле. И предикат выглядит:

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

0

Эта работа вокруг было меньше чем идеал, но, похоже, он выполнил свою работу: 1 - Я добавил атрибут subject, называемый count. 2 - Я установил (часть) мое выражение на ANY Соответствие.subjects.count == 1 Обратите внимание, что для этого обходного пути не было необходимости в SUBQUERY(). 3 - Каждый раз, когда я изменяю набор корреспондентов, я запускаю subject.count = @ (subject.correspondents.count);

Я все еще надеюсь на лучшее решение и буду рад отметить любое (рабочее) лучшее решение как правильное.

Смежные вопросы