我有coreData模型:
我试图验证电影和电影院的电影时间表,但我得到错误"这里不允许使用多对键"
这是我的代码:
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];
我能得到时间表和电影的匹配,但我的问题是如何才能获得时间表,电影和剧院的匹配,你们中的任何人都知道我做错了什么?
我真的很感谢你的帮助
答案 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]];