NSPredicate:按NSDate属性过滤对象

我有一个NSDate属性的核心数据模型。 我想在白天过滤数据库。 我假设解决方案将涉及NSPredicate ,但我不确定如何将它们放在一起。

我知道如何将两个的日子比较NSDate S使用NSDateComponentsNSCalendar ,但我怎么用过滤它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中不能比较日期。

链接地址: http://www.djcxy.com/p/60627.html

上一篇: NSPredicate: filtering objects by day of NSDate property

下一篇: Core Data, NSPredicate and to