Ios NSPredicate:根据NSDate使用自由文本筛选对象
我有一个具有NSDate属性的核心数据模型。我想通过键入任何文本(例如月份和/或年份)来过滤数据库,例如“May”、“2001”、“May 2001”等。第一个示例将带回数据月份为May的任何对象,第二个示例将带回2001年的对象,第三个示例将带回2001年5月的对象 我假设解决方案将涉及NSPredicate,但我不确定如何将其全部放在一起 我能否以某种方式格式化NSDate属性并简单地执行[contains]搜索文本Ios NSPredicate:根据NSDate使用自由文本筛选对象,ios,objective-c,core-data,nspredicate,Ios,Objective C,Core Data,Nspredicate,我有一个具有NSDate属性的核心数据模型。我想通过键入任何文本(例如月份和/或年份)来过滤数据库,例如“May”、“2001”、“May 2001”等。第一个示例将带回数据月份为May的任何对象,第二个示例将带回2001年的对象,第三个示例将带回2001年5月的对象 我假设解决方案将涉及NSPredicate,但我不确定如何将其全部放在一起 我能否以某种方式格式化NSDate属性并简单地执行[contains]搜索文本 如果您有任何建议,我们将不胜感激。您可以使用NSDateFormatter
如果您有任何建议,我们将不胜感激。您可以使用
NSDateFormatter
(或简单的description
方法)以字符串形式获取日期,并检查特定字符串。但要做到这一点,您必须从您的商店中获取所有对象,这将是非常低效的。
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);
相反,您可以创建另一个与Date
实体的关系(或自定义属性),该实体将包含日期、月份和年份信息。(您可以将其与日期属性一起使用,也可以不使用)。然后,无论您尝试执行何种类型的搜索(月、日或日),都可以轻松编写谓词
对于设置和获取属性,可以使用实体的NSManagedObject
子类中的自定义方法
例如:如果您的实体是事件
,则
事件
- eName
- 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;
}
通过免费文本,它是否也包括一天?谢谢你的答复。它为我指明了正确的方向——非常感谢!好的,所以在核心数据DATANSPRADIATE中不支持块的NSPReDATE是基础框架中的一个类。你说核心数据中不支持是什么意思。你能详细说明一下吗?也许我错了,但在获取请求中使用它会引发异常。我在使用SQLLite时遇到了与中讨论的相同的问题,谢谢或您的建议。我不希望在这些阶段创建另一个属性,但如果找不到更好的方法,我可能不得不这样做。