Core data 使用ARC将iPhone应用程序转换为xcode 4.5.2 iOS6后,CoreData NSPredicate错误NSInvalidArgumentException

Core data 使用ARC将iPhone应用程序转换为xcode 4.5.2 iOS6后,CoreData NSPredicate错误NSInvalidArgumentException,core-data,ios6,nsdate,Core Data,Ios6,Nsdate,这是我在stackoverflow的第一个问题。这个社区对我很有帮助,它为我的iPhone应用开发提供了很多解决方案。然而,本周我遇到了一个问题,花了两天时间都没有取得任何进展。我把这个问题贴在这里,希望能在你们的帮助下得到解决 我使用的是coredata,有两个表格,祈祷和日程安排,有多对多的关系。我想得到一份安排在今天的祈祷名单。这是我的密码: NSPredicate *predicate; unsigned units = NSDayCalendarUnit | NSMon

这是我在stackoverflow的第一个问题。这个社区对我很有帮助,它为我的iPhone应用开发提供了很多解决方案。然而,本周我遇到了一个问题,花了两天时间都没有取得任何进展。我把这个问题贴在这里,希望能在你们的帮助下得到解决

我使用的是coredata,有两个表格,祈祷和日程安排,有多对多的关系。我想得到一份安排在今天的祈祷名单。这是我的密码:

    NSPredicate *predicate;
    unsigned units = NSDayCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setTimeZone:[NSTimeZone localTimeZone]]; 
    [gregorian setFirstWeekday:1];
    NSDateComponents* comps = [gregorian components:units fromDate:[NSDate date]]; // Get necessary date components
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:1];

    //get beginning of today
    NSDate *startOfToday = [gregorian dateFromComponents:comps];
    //get the beginning of tomorrow
    [comps setDay:[comps day] + 1];
    NSDate *endOfDay = [gregorian dateFromComponents:comps];

    NSLog(@"%@ %@", startOfToday,endOfDay);

    predicate = [NSPredicate predicateWithFormat:@"ANY (schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@) AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday, endOfDay];

    [request setPredicate:predicate];
        NSError *error = nil;
    NSArray *fetchResults = [context executeFetchRequest:request error:&error];
但是,我需要比较schedules.nextEventDateTime>=startOfToday和 如果我将行更改为以下内容(删除父项)

predicate=[NSPredicate predicateWithFormat:@“ANY schedules.nextEventDateTime>=%@和schedules.nextEventDateTime<%@和祈祷类型==0和完成==YES和回答==NO”,从今天开始,结束日期];
它将通过该行运行,但在该行失败: NSArray*fetchResults=[context executeFetchRequest:request error:&error]

错误是:*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“此处不允许使用多个密钥”

有人知道我的代码出了什么问题吗?如有任何建议和意见,我们将不胜感激

谢谢,

我想在你的情况下,
子查询
可能会对你有所帮助

predicate = [NSPredicate predicateWithFormat:@"prayerType == 0 AND finished == YES AND answered == NO AND SUBQUERY(schedules, $sub, $sub.nextEventDateTime >= %@ AND $sub.nextEventDateTime <  %@).@count > 0", startOfToday, endOfDay];
predicate=[NSPredicate predicateWithFormat:@“祈祷类型==0,完成==YES,回答==NO和子查询(计划,$sub,$sub.nextEventDateTime>=%@和$sub.nextEventDateTime<%@.@count>0”,开始到今天,结束日期];

注意表达顺序。一般来说,连接(交叉关系的查询)也是昂贵的操作,如果可以的话,应该避免它们。除非第一次测试成功,否则避免加入。

Hey@Joe答案对你有用吗?Mark,非常感谢。您提供的解决方案非常有效。
     2013-03-15 23:41:36.763 WePrayers[12121:c07] 2013-03-15 04:00:01 +0000 2013-03-16 04:00:01 +0000

     2013-03-15 23:41:37.837 WePrayers[12121:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "ANY (schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@) AND prayerType == 0 AND finished == YES AND answered == NO"'
     *** First throw call stack:
     (0x29f2012 0x20ebe7e 0x1abc25 0x1aba43 0x1ab9f7 0x19ce5 0x186fb 0x61e8d5 0x61eb3d 0x190e83 0x29b1376 0x29b0e06 0x2998a82 0x2997f44 0x2997e1b 0x2f207e3 0x2f20668 0x56f65c 0x2ecd 0x2e05)
     libc++abi.dylib: terminate called throwing an exception
    predicate = [NSPredicate predicateWithFormat:@"ANY schedules.nextEventDateTime >= %@ AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday];
    predicate = [NSPredicate predicateWithFormat:@"ANY schedules.nextEventDateTime >= %@ AND schedules.nextEventDateTime < %@ AND prayerType == 0 AND finished == YES AND answered == NO", startOfToday, endOfDay];
predicate = [NSPredicate predicateWithFormat:@"prayerType == 0 AND finished == YES AND answered == NO AND SUBQUERY(schedules, $sub, $sub.nextEventDateTime >= %@ AND $sub.nextEventDateTime <  %@).@count > 0", startOfToday, endOfDay];