Основные данные Предикат проблемы «один ко многим» и «многие к одному»

У меня есть сущности Клиент и сущности Задание.

Каждое задание может иметь одного клиента. Отношение для заданий клиента (client‹-->>job) называется jobOfClient.

У каждого клиента может быть много заданий. Отношение для клиента задания (задание‹‹-->клиент) называется clientOfJob.

(Конечно, это обратные отношения.)

У меня есть некоторые предикаты, которые работают, но последний не работает. Опуская часть настройки fetchedResultsController, вот несколько ключевых строк кода для трех случаев:

Здесь я сортирую вакансии, ищу работы, которые не связаны ни с одним клиентом:

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext];

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == nil"];

Здесь я перебираю вакансии, ищу вакансии конкретного клиента:

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == %@", userState.selectedClient];

Но этот следующий не работает. Здесь я сортирую клиентов, ища одного клиента, связанного с выбранной работой (или не возвращаю результата, если связанного клиента нет, но здесь это не так).

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:dataInterface.managedObjectContext];    
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"jobOfClient == %@", userState.selectedJob];

Сообщение об ошибке: Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Ключ для многих не разрешен здесь"

Здесь должно быть что-то тонкое, чего я не понимаю. Может ли кто-нибудь помочь мне с **информацией, которую я дал?


person Jim    schedule 11.05.2011    source источник


Ответы (1)


jobOfClient вернет набор объектов, что означает, что ваш предикат по существу делает:

NSSet *jobs = [thisObject jobOfClient];
return ([jobs isEqual:aJob]);

Очевидно, что коллекция никогда не равна одному значению, поэтому CoreData не распознает предикат. Чтобы обойти это, я думаю, вы можете сделать:

[NSPredicate predicateWithFormat:@"jobOfClient CONTAINS %@", [userState selectedJob]];

И чтобы убедиться, что вы не столкнетесь с этим снова, я бы рекомендовал изменить имя этой связи с jobOfClient на просто jobs (используя форму множественного числа, чтобы указать, что это связь ко многим, и исключить OfClient, потому что она уже включена). сущность Client). Другие ваши отношения, вероятно, следует переименовать аналогичным образом. clientOfJob => client и т. д.

person Dave DeLong    schedule 11.05.2011
comment
Спасибо. Я смог решить проблему, используя это: NSPredicate *predicate = [NSPredicate predicateWithFormat: @ANY jobOfClient == %@, userState.selectedJob]; -- Ключевое слово any заставляло просматривать все в наборе. - person Jim; 12.05.2011