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

Posted

技术标签:

【中文标题】作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词【英文标题】:Range of dates as fetch predicate - NSDate predicate between Core Data 【发布时间】:2011-10-23 11:48:18 【问题描述】:

我正在尝试获取存储在核心数据中的核心数据项,该核心数据项过滤到日期类型字段 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 count] 时,我在对象上得到 nil。

我的获取代码:

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;

【问题讨论】:

【参考方案1】:

这看起来很像您的变量startDateendDate 将包含意外值。 startDate 来自没有日期等的日期组件,endDate 来自startDate

因此,我建议在谓词定义之前放置断点或NSLog 语句以检查这些值。

另外,不清楚您使用的是什么NSCalendar。来自documentation:

日、周、工作日、月和年数字通常从 1 开始,但 可能存在特定于日历的例外情况。

看来,例如将day 属性设置为0 可能会有问题。

【讨论】:

【参考方案2】:

为您的谓词尝试不同的格式:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eventStartDate > %@) AND (eventStartDate <= %@)",startDate,endDate];`

只在单个语句周围放置括号,而不是在整个语句周围。

【讨论】:

【参考方案3】:

ios 6 之后,如前所述,此谓词有效。

  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"startDate > %@",[NSDate date];`

谢谢。

【讨论】:

以上是关于作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象

需要编写一个谓词来搜索核心数据对象数组属性中的日期(在我的例子中是日期数组)

如何在 coredata 中设置日期和时间间隔的谓词

子查询谓词核心数据

核心数据谓词根据关系获取数据,错误为无法解析格式字符串

核心数据谓词根据日期属性过滤对象