Ios NSPredicate:根据NSDate使用自由文本筛选对象

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

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

我假设解决方案将涉及NSPredicate,但我不确定如何将其全部放在一起

我能否以某种方式格式化NSDate属性并简单地执行[contains]搜索文本


如果您有任何建议,我们将不胜感激。

您可以使用
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时遇到了与中讨论的相同的问题,谢谢或您的建议。我不希望在这些阶段创建另一个属性,但如果找不到更好的方法,我可能不得不这样做。