我是核心数据的菜鸟。我有两个实体Venue和Concert以及两个关系音乐会(从场地到音乐会)和场地(从音乐会到场地)。我想要做的是基本上检索两个日期之间包含的场地的所有音乐会(startDate-endDate)。
NSPredicate *concertsToShow = [NSPredicate predicateWithFormat:@"ALL concerts.startDate <= %@ AND concerts.endDate >= %@",startDate,endDate];
NSManagedObjectContext *managedObjectContext = ((AppDelegate *)[[UIApplication sharedApplication]delegate]).managedObjectContext;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Venue" inManagedObjectContext:managedObjectContext]];
[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"concerts", nil]];
[request setPredicate:concertsToShow];
NSError *error = nil;
NSArray *concerts = [managedObjectContext executeFetchRequest:request error:&error];
return concerts;
当代码运行时,我得到以下异常:
由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'不支持的谓词(null)' *
我试图在谓词上加上括号,但后来说它无法解析谓词。
我最终使用子查询
NSPredicate *concertsToShow = [NSPredicate predicateWithFormat:@"SUBQUERY(concerts, $i, $i.startDate BETWEEN {%@,%@}).@count>0",startDate,endDate];
问题在于它仅对场地执行过滤:它仅检索具有音乐会的场地,其中日期包含在startDate和endDate之间,但不会过滤相关的音乐会。我想要实现的是让这个过滤PLUS过滤音乐会。 例如,我有两个与音乐会相关的场地(仅示例中显示的日期): “爱尔兰酒吧” - &gt;&gt; (01-04-2013,02-04-2013,03-04-2013,04-04-2013) “英语酒吧” - &gt;&gt; (2013年5月4日)
如果我的谓词的startDate和endDate分别是02-04-2013和04-04-2013 结果应该是:
“Irish Pub” - &gt;&gt; (02-04-2013,03-04-2013,04-04-2013)
答案 0 :(得分:0)
正如 Rob 所提到的,您的错误消息显示您有nil谓词。
所以在发出请求之前先把日志和检查谓词值。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ALL concerts.startDate <= %@ AND concerts.endDate >= %@",startDate,endDate];
NSLog(@"my predicate is :%@",predicate);
对于我建议的良好做法,也总是这样做
if(predicate!=nil){
//now make request here
}
如果您需要更多帮助,请告诉我。