我有一个带有 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;
}