我正在尝试将存储在Core Data中的核心数据项过滤到eventStartDate字段下的日期范围,这是Date类型 - 我正在使用Xcode生成的名为Event的托管对象来代理核心数据项。当我执行获取请求时,不会返回任何内容。我试着查看SQL日志,看到正在调用后面的sql,看起来是正确的:
SELECT 0, t0.Z_PK FROM ZEVENT t0 WHERE ( t0.ZEVENTSTARTDATE > ? AND t0.ZEVENTSTARTDATE <= ?) ORDER BY t0.ZEVENTSTARTDATE
我什么都没回来,当我尝试po [mgtEventArray计数]时,我对这个对象没有任何意义。
我的提取代码:
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit ) fromDate:[NSDate date]];
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:10];
[components setDay:0];
[components setYear:0];
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((eventStartDate > %@) AND (eventStartDate <= %@))",startDate,endDate];
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortDescKey ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
NSError *error = nil;
NSArray *mgtEventArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if(error != nil)
NSLog(@"%@", error);
return mgtEventArray;
答案 0 :(得分:3)
这看起来很像您的变量startDate
和endDate
会包含意外值。 startDate
来自日期组件,没有一天等,而endDate
来自startDate
。
因此,我建议在谓词定义之前添加断点或NSLog
语句,以便检查这些值。
此外,还不清楚您使用的NSCalendar
。来自documentation:
日,周,工作日,月和年数通常是1,但是 可能存在特定于日历的例外情况。
所以看来,例如将day
属性设置为0
可能会有问题。
答案 1 :(得分:2)
为谓词尝试不同的格式:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eventStartDate > %@) AND (eventStartDate <= %@)",startDate,endDate];`
只在单个语句周围加上括号,而不是整个语句。
答案 2 :(得分:0)
在iOS 6之后,如前所述,这个谓词有效。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate > %@",[NSDate date];`
谢谢。