0

我有一个带有 NSDate 属性的核心数据模型。我想通过输入任何文本来过滤数据库,例如月份和/或年份,例如“May”、“2001”、“May 2001”等。第一个示例将带回数据月份为的任何对象5 月 2 日将带回 2001 年的对象,3 日将带回 2001 年 5 月的对象。

我认为解决方案将涉及 NSPredicate,但我不确定如何将它们组合在一起。

我可以以某种方式格式化 NSDate 属性并简单地执行 [包含] 搜索文本吗?

任何建议将不胜感激。

4

2 回答 2

0
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);
于 2013-06-27T08:18:31.257 回答
0

NSDateFormatter您始终可以使用(或简单方法)将日期作为字符串获取description并检查特定字符串。但是为此,您必须从商店中获取所有对象,这将非常低效。Date相反,您可以为具有日、月和年信息的实体创建另一个关系(或自定义属性) 。(您可以将它与 date 属性一起使用,也可以不使用它)。然后,无论您尝试执行的搜索类型是什么 - 月、日或日,都可以轻松编写谓词。

对于设置和获取属性,您可以NSManagedObject在实体的子类中使用自定义方法。

例如:如果您的实体Event看起来像

事件

  • 易名
  • eDate   (另一个实体EventDate - 一对一关系)

看起来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;
}
于 2013-06-27T10:36:40.503 回答