核心数据:NSPredicate用于多对多关系。 (“这里不允许使用多个键”)

时间:2010-11-18 17:42:17

标签: core-data ios nspredicate

我有两个名为“Category”和“Article”的实体,它们有多对多关系。我想形成一个谓词,搜索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'

是否有任何选项可以检索所需的数据?

3 个答案:

答案 0 :(得分:145)

您尝试将集合(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 :(得分:1)

SWIFT SYNTAX

如果有人像我一样迅速写这篇文章......

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

为我工作。

答案 2 :(得分:0)

对于那些面临相同问题的人。您可以使用 IN 运算符代替 = / == 来查找任何集合中的特定对象。 寻找here供参考。 Swift或Objective-C