核心数据:多对多关系的NSPredicate。(“不允许在此处使用to-many键”)

71

我有两个实体名为“Category”和“Article”,它们之间存在多对多的关系。我想形成一个谓词,搜索所有分类名称等于某个值的文章。我有以下代码:

 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'

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


一个子查询可能是你需要的。参见:https://dev59.com/p2XWa4cB1Zd3GeqPQMQj - Collin
1
新鲜资讯:https://dev59.com/jHE95IYBdhLWcg3wY9D6#60637295 - Fattie
3个回答

162

你正在尝试将一个集合 (categories.name) 与标量值 (category.name) 进行比较。你需要使用集合比较器(CONTAINS),或使用谓词修改器 (ANY/ALL/SOME等)。

尝试使用:

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

或者:

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

这对我很有效,无论是否加上 '[cd]'。你能解释一下它的功能吗? - Duncan Babbage
17
@DuncanBabbage 中的 [cd] 表示执行不区分大小写搜索(c)和不区分重音符号搜索(d)。 - Dave DeLong
3
如果categoryArticle之间存在反向的to one关系,则它将不起作用。你有什么方法来预测这种情况? - iEngineer

10

SWIFT 语法

如果你像我一样在使用 Swift 进行编程时遇到了问题……

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

对我有用。

0
对于那些遇到相同问题的人,可以使用IN运算符来查找任何集合中特定对象,而不是使用= / ==。点击此处参考。无论是Swift还是Objective-C都一样

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接