核心数据:使用NSPredicate过滤一对多关系(此处不允许出现错误对多关键)

时间:2015-02-13 08:44:21

标签: ios objective-c core-data nspredicate

我有coreData模型:

enter image description here

我试图验证电影和电影院的电影时间表,但我得到错误"这里不允许使用多对键"

这是我的代码:

NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *timeDescription = [ NSEntityDescription entityForName:@"Schedules" inManagedObjectContext:moc];
    NSPredicate *timePredicate  = [NSPredicate predicateWithFormat:@"showTimes <= %@", _movieTime];
    NSPredicate *moviePredicate = [NSPredicate predicateWithFormat:@"ANY movie.nameOfMovie CONTAINS[cd] %@", _movie];
    NSPredicate *theatersPredicate = [NSPredicate predicateWithFormat:@"movie.theaters.nameOfTheater == %@", _theaterName];
    NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[timePredicate,moviePredicate,theatersPredicate]];

    NSFetchRequest *request = [NSFetchRequest new];
    request.predicate = compoundPredicate;
    request.entity = timeDescription;
    NSError *error = nil;

    NSArray *result = [moc executeFetchRequest:request error:&error];

如果我只使用以下谓词:

NSPredicate *timePredicate  = [NSPredicate predicateWithFormat:@"showTimes <= %@", _movieTime];
NSPredicate *moviePredicate = [NSPredicate predicateWithFormat:@"ANY movie.nameOfMovie CONTAINS[cd] %@", _movie];

我能得到时间表和电影的匹配,但我的问题是如何才能获得时间表,电影和剧院的匹配,你们中的任何人都知道我做错了什么?

我真的很感谢你的帮助

1 个答案:

答案 0 :(得分:1)

你在这里不允许使用&#34; to-many键&#34;错误,因为,在您的theatersPredicate&#34;电影&#34;是一种多对多的关系。与您的moviePredicate进行比较,因为它使用&#34; ANY&#34;关键字。

所以你可能想要添加&#34; ANY&#34;到你的theatersPredicate。这将是有效的(即编译并运行OK),但我认为不会给你你正在寻找的结果:它会显示那些&#34;(任何电影和'moviename匹配)和(任何电影&#) 39; nameOfTheatre匹配)&#34;。但在每种情况下都可能是不同的电影。

我认为你想要的是&#34;任何电影在哪里(moviename匹配和nameOfTheatre匹配)&#34;。为此,请使用SUBQUERY:

NSPredicate *timePredicate  = [NSPredicate predicateWithFormat:@"showTimes <= %@", _movieTime];
NSPredicate *movieAndTheaterPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(movie, $x, $x.nameOfMovie CONTAINS[cd] %@ AND $x.theaters.nameOfTheater == %@).@count > 0", _movie, _theaterName];
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[timePredicate,movieAndTheaterPredicate]];