Базовые данные: NSP предикат для отношений «многие ко многим».(«ключ ко многим здесь не разрешен») - PullRequest
62 голосов
/ 18 ноября 2010

У меня есть две сущности с именами «Категория» и «Статья», которые имеют отношения многие ко многим.Я хочу сформировать предикат, который ищет все статьи, где category.name равно некоторому значению.У меня есть следующее:

 NSEntityDescription  *entityArticle   = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:managedObjectContext]; 
 NSSortDescriptor  *sortDescriptor   = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
 NSArray     *sortDescriptors  = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
 NSPredicate    *predicate    = [NSPredicate predicateWithFormat:@"categories.name == [cd] %@", category.name]; 

 [request setSortDescriptors:sortDescriptors];
 [request setEntity:entityArticle];
 [request setPredicate:predicate];

 NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy];

 if ([results count] > 0)
  NSLog(@"Results found."); 
 else 
  NSLog(@"NO results found."); 

 [request release];
 [sortDescriptor release];
 [sortDescriptors release];

Я получаю сообщение об ошибке: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

Есть ли какие-либо варианты для получения нужных данных?

Ответы [ 2 ]

145 голосов
/ 18 ноября 2010

Вы пытаетесь сравнить коллекцию (categories.name) со скалярным значением (category.name). Вам нужно либо использовать компаратор коллекций (CONTAINS), либо использовать модификатор предиката (ANY / ALL / SOME и т. Д.).

Попробуйте использовать:

[NSPredicate predicateWithFormat:@"ANY categories.name =[cd] %@", category.name];

Или:

[NSPredicate predicateWithFormat:@"categories.name CONTAINS[cd] %@", category.name];
1 голос
/ 20 марта 2018

SWIFT SYNTAX

На случай, если кто-нибудь произойдет с этим письмом в кратчайшие сроки, как я ...

let predicate = NSPredicate(format: "ANY categories.name = %@", category.name!)
fetchRequest.predicate = predicate

сработало для меня.

...