2013-06-27 66 views
0

我有一個具有NSDate屬性的Core Data模型。我想通過輸入任何文本(例如一個月和/或一年)來過濾數據庫,例如「May」,「2001」,「May 2001」等。第一個示例將返回數據月份爲May的任何對象,第二個將在2001年帶回對象,第三個將爲May帶回對象2001.NSPredicate:使用自由文本對NSDate篩選對象

我認爲解決方案將涉及NSPredicate,但我不知道如何把它放在一起。

我可以以某種方式格式化NSDate屬性,只需執行[contains] searchtext?

任何建議將不勝感激。

+0

通過自由文本,它包括一天也? – Rakesh

回答

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); 
+0

感謝您的回覆。它向我指出了正確的方向 - 非常感謝! – Alan

+0

好吧,所以這沒有奏效,因爲它出現NSPredicate with block在覈心數據中不受支持 – Alan

+0

NSPredicate是Foundation.framework中的一個類。核心數據不支持你的意思是什麼?你能詳細說明嗎? – iCoder

0

你總是可以得到利用NSDateFormatter日期爲字符串(或簡單的description方法),並做特定的字符串進行檢查。但爲此,您將不得不從商店獲取所有對象,效率非常低。 相反,您可以創建另一個關係(或自定義屬性)到Date實體,該實體將具有日,月和年的信息。 (你可以把它和日期屬性一起或沒有它)。然後,可以很容易地編寫謂詞,無論您嘗試執行哪種類型的搜索 - 月份,日期或日期。

並且爲了設置和獲取屬性,您可以在實體的NSManagedObject子類中使用自定義方法。

對於例如:如果你的實體是Event它看起來像

事件

  • 易名
  • EDATE    (另一個實體EVENTDATE - 一對一的關係)

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; 
} 
+0

感謝或您的建議。我寧願不必在這個階段創建另一個屬性,但如果我找不到更好的方法,可能必須走這條路。 – Alan