2011-12-26 79 views
0

我有一個託管對象引用*事件。對多對多關係的描述

一個事件有很多事件發生。一個事件有一個屬性調用date

我想獲取具有今天日期的事件*事件的所有事件。我應該如何在FetchRequest上編寫NSPredicate。

回答

0

您必須意識到,有兩種方法可以獲取您的發生對象:您可以遍歷來自Event對象的關係(即myEvent.occurences),或者您可以爲所有出現感興趣事件的事件創建一個獲取請求在他們的反比關係中,即一個謂詞如[NSPredicate predicateWithFormat:@"event == %@", myEvent"]

這兩者有根本的區別。取數請求將總是執行導致SQL執行併發生I/O,這很昂貴。如果你只是遍歷關係,你處於發生對象已經在內存中的情況,這將是非常便宜(沒有SQL,沒有I/O)。另一方面,獲取請求將允許您一次處理所有對象中的錯誤,而遍歷只會一次處理一個錯誤對象,因此您將最終執行多個SQL + I/O事件。另外,提取請求允許您進一步限制謂詞。但在很多情況下,簡單遍歷可能是最好的情況。

CoreData爲您做了很多繁重的工作,但在一天結束時,您仍然需要知道何時執行SQL和I/O以及如何防止它。

我希望這會有所幫助。

+0

謝謝。這是一個很好的解釋 – Anand 2012-01-04 14:58:36

1

這裏是過濾掉今天發生的事件的謂詞的構造。

NSDate *today = [NSDate date]; 

NSCalendar *gregorian = [[NSCalendar alloc] 

         initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *components =[gregorian components:(NSDayCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit) fromDate:today]; 
[components setHour:0]; 
[components setMinute:0]; 
[components setSecond:0]; 
NSDate *todayMidnight=[gregorian dateFromComponents:components]; 
#define Hours_24 86400 
NSDate *tomorrowMidnight=[NSDate dateWithTimeInterval:Hours_24 sinceDate:todayMidnight]; 
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"occurance.date >= %@ AND occurance.date< %@",todayMidnight,tomorrowMidnight]; 
[gregorian release]; 

由於occurance屬性爲NSDate數據類型,就會有時間和日期。因此,這個謂詞會過濾掉所有的日期從今天午夜到明天午夜的occurances。另一種方式(在我看來更好)是獲得Occurances,然後進行過濾。 如果您只想要occurance而不是事件,請不要忘記setPropertiesToFetch:至occurance。這將返回一個NSDictionary