作为获取谓词的日期范围 - 核心数据之间的NSDate谓词

时间:2011-10-23 11:48:18

标签: iphone ios core-data nspredicate

我正在尝试将存储在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;

3 个答案:

答案 0 :(得分:3)

这看起来很像您的变量startDateendDate会包含意外值。 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];`

谢谢。