我有一个带有 NSDate 属性的核心数据模型。我想通过输入任何文本来过滤数据库,例如月份和/或年份,例如“May”、“2001”、“May 2001”等。第一个示例将带回数据月份为的任何对象5 月 2 日将带回 2001 年的对象,3 日将带回 2001 年 5 月的对象。
我认为解决方案将涉及 NSPredicate,但我不确定如何将它们组合在一起。
我可以以某种方式格式化 NSDate 属性并简单地执行 [包含] 搜索文本吗?
任何建议将不胜感激。
我有一个带有 NSDate 属性的核心数据模型。我想通过输入任何文本来过滤数据库,例如月份和/或年份,例如“May”、“2001”、“May 2001”等。第一个示例将带回数据月份为的任何对象5 月 2 日将带回 2001 年的对象,3 日将带回 2001 年 5 月的对象。
我认为解决方案将涉及 NSPredicate,但我不确定如何将它们组合在一起。
我可以以某种方式格式化 NSDate 属性并简单地执行 [包含] 搜索文本吗?
任何建议将不胜感激。
NSDate *today = [NSDate date];
NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0];
NSDate *thisWeek  = [today dateByAddingTimeInterval: -604800.0];
NSDate *lastWeek  = [today dateByAddingTimeInterval: -1209600.0];
NSArray *dates = @[today, yesterday, thisWeek, lastWeek];
NSArray *filteredArray = [dates filteredArrayUsingPredicate:
 [NSPredicate predicateWithBlock:^BOOL(NSDate *item, NSDictionary *bindings) {
    // Logic for searching comes here
    // For instance date with day 27 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:item];
    NSInteger day = [components day];
    return (day == 27);
}]];
NSLog(@"%@",filteredArray);
NSDateFormatter您始终可以使用(或简单方法)将日期作为字符串获取description并检查特定字符串。但是为此,您必须从商店中获取所有对象,这将非常低效。Date相反,您可以为具有日、月和年信息的实体创建另一个关系(或自定义属性) 。(您可以将它与 date 属性一起使用,也可以不使用它)。然后,无论您尝试执行的搜索类型是什么 - 月、日或日,都可以轻松编写谓词。
对于设置和获取属性,您可以NSManagedObject在实体的子类中使用自定义方法。
例如:如果您的实体Event看起来像
事件
看起来EventDate像
活动日期
然后用于设置使用日期
-(void)setEDateUsingDate:(NSDate *)date{
//gather current calendar
    NSCalendar *calendar = [NSCalendar currentCalendar];
    //gather date components from date
    NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
    //set date components
    self.eDate.day=[dateComponents day];
    self.eDate.month=[dateComponents month];
    self.eDate.year=[dateComponents year];
}
并获得日期将是
-(NSDate *)dateFromEDate{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
   [components setDay:self.eDate.day];
   [components setMonth:self.eDate.month];
   [components setMonth:self.eDate.year];
   NSDate *date = [calendar dateFromComponents:components];
   return date;
}