NSPredicate:按NSDate属性过滤对象
我有一个NSDate
属性的核心数据模型。 我想在白天过滤数据库。 我假设解决方案将涉及NSPredicate
,但我不确定如何将它们放在一起。
我知道如何将两个的日子比较NSDate
S使用NSDateComponents
和NSCalendar
,但我怎么用过滤它NSPredicate
?
也许我需要在我的NSManagedObject
子类上创建一个可以返回仅包含年份,月份和日期的裸露日期的类别。 然后我可以比较一下NSPredicate
。 这是你的建议,还是有一些更简单的?
给定一个NSDate * startDate和endDate和一个NSManagedObjectContext * moc:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:moc]];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
关于如何将startDate和endDate设置为上述给定答案的示例:
...
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit ) fromDate:[NSDate date]];
//create a date with these components
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:1];
[components setDay:0]; //reset the other components
[components setYear:0]; //reset the other components
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
predicate = [NSPredicate predicateWithFormat:@"((date >= %@) AND (date < %@)) || (date = nil)",startDate,endDate];
...
在这里我正在一个月内搜索所有条目。 值得一提的是,这个例子还展示了如何搜索'无'日期。
在Swift中,我得到了类似于:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date = dateFormatter.dateFromString(predicate)
let calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
let components = calendar!.components(
NSCalendarUnit.CalendarUnitYear |
NSCalendarUnit.CalendarUnitMonth |
NSCalendarUnit.CalendarUnitDay |
NSCalendarUnit.CalendarUnitHour |
NSCalendarUnit.CalendarUnitMinute |
NSCalendarUnit.CalendarUnitSecond, fromDate: date!)
components.hour = 00
components.minute = 00
components.second = 00
let startDate = calendar!.dateFromComponents(components)
components.hour = 23
components.minute = 59
components.second = 59
let endDate = calendar!.dateFromComponents(components)
predicate = NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
我很难发现字符串插值"(this notation)"
在NSPredicate中不能比较日期。
上一篇: NSPredicate: filtering objects by day of NSDate property