2011-12-26 7 views
0

私は管理オブジェクト参照*イベントを持っています。述語対多関係

イベントには数多くの出現があります。オカレンスにアトリビュートコールがありますdate

今日の日付を持つイベント*イベントのすべてのオカレンスを取得します。どのようにしてFetchRequestにNSPredicateを書くべきですか?

答えて

0

Occurrenceオブジェクトを取得するには、2つの方法があることに注意する必要があります。Eventオブジェクト(つまりmyEvent.occurences)からリレーションシップをトラバースするか、関心のあるイベントを含むすべてのイベントに対してフェッチ要求を作成できますそれらの逆の関係、すなわち[NSPredicate predicateWithFormat:@"event == %@", myEvent"]のような述語である。

これら2つには基本的な違いがあります。フェッチ要求がの場合は常にが実行され、高価なI/Oが実行されます。関係を単にトラバースすれば、は、オカレンスオブジェクトがすでにメモリに入っている状況にあるため、SQL(I/Oなし)は非常に安いものになります。一方、フェッチ要求では、すべてのオブジェクトを一度にフォルトすることができますが、トラバースはオブジェクトを1つずつフォールトさせるだけなので、複数のSQL + I/Oイベントが終了します。また、フェッチ要求により、述語をさらに制限することができます。しかし、多くの場合、単にトラバースすることが最良のケースかもしれません。

CoreDataは非常に重労働ですが、終わりにはSQLとI/Oをいつ実行するのか、それを防ぐ方法についても理解する必要があります。

こちらがお役に立てば幸いです。

+0

ありがとうございました。それは良い説明だった – Anand

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を忘れず、イベントではなく、setPropertiesToFetchoccuranceを忘れないようにしてください。これにより、NSDictionaryが返されます。