核心数据,尝试使用NSPredicate过滤一个toMany关系集,但得到“这里不允许的多对键”错误

时间:2010-09-05 03:05:35

标签: iphone objective-c core-data nspredicate

这是我的模型: http://www.girardet.ch/model.png

我的目标是使用这些标准检索所有引号:

  • 属于特定主题:Themes
  • 的name_en属性
  • 按相关性排序
  • 按作者过滤(使用作者的别名属性)

这是我的代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ThemeEntries" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"relevancy" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

// predictate - filter
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@ AND quotes.author.alias=%@",@"mytheme", @"myauthor"];

[fetchRequest setPredicate:predicate];

我得到“这里不允许使用多对键”错误。

如果我改为使用这个谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@, @"mytheme"];

它运作良好,我可以遍历我得到的ThemeEntries并得到我所有的引用......但它不会被作者过滤。

我可以做些什么来过滤作者?

1 个答案:

答案 0 :(得分:26)

你的问题是你的一个keypath的关系是to-many,to-many,而谓词不知道哪个特定对象与哪个相关。

你有ThemeEntities<<-->>Quotes,它在每一端产生一个集合。 quotes.author.alias密钥路径表示“一组引号实例,每个实例都链接到作者实例,后者又具有别名属性。”谓词无法处理集合。

您需要使用子查询来跳转到多个键路径。子查询本质上是一个嵌套谓词,它搜索一个集合并返回与嵌套谓词匹配的另一组对象。子查询的文档记录很少,但它们的格式如下:

SUBQUERY(collectionName,$collectionElementVariable,expression-with-$collectionElementVariable)

在这种情况下,您正在寻找具有与所提供字符串匹配的别名的作者关系的任何引用实例。你的谓词需要看起来像:

@"theme.name_en=%@ AND (0!=SUBQUERY(quotes,$eachQuote,$eachQuote.author.alias=%@).@count)",@"mytheme", @"myauthor"

子查询说,“在引号集中,取每个引用对象并测试其作者关系对象是否具有与'myauthor'匹配的别名属性。计算具有该匹配的引用对象的数量。如果该数字为非零,返回TRUE。“

每当您跨越多对多关系的密钥路径时,您都需要使用子查询。