[英]Range of dates as fetch predicate - NSDate predicate between Core Data
我试图获取存储在核心数据中的核心数据项过滤到日期类型的字段eventStartDate下的日期范围 - 我正在使用由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;
这看起来很像你的变量startDate
和endDate
会包含意外的值。 startDate
来自没有一天等的日期组件,以及来自startDate
的endDate
。
因此,我建议在断言定义之前放置断点或NSLog
语句,以便检查这些值。
此外,目前尚不清楚您正在使用的NSCalendar
。 从文档 :
日,周,工作日,月和年数通常是基于1的,但可能存在特定于日历的例外情况。
所以似乎将例如将day
属性设置为0
可能会有问题。
为谓词尝试不同的格式:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eventStartDate > %@) AND (eventStartDate <= %@)",startDate,endDate];`
只是在单个陈述周围放置了对象,而不是围绕整个陈述。
在iOS 6之后,如前所述,这个谓词有效。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate > %@",[NSDate date];`
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.