对许多关系的谓词

时间:2011-12-26 04:34:24

标签: ios cocoa-touch core-data

我有一个托管对象引用*事件。

事件有很多次发生。一次出现有一个属性调用date

我想获取具有今天日期的事件*事件的所有事件。我应该如何在FetchRequest上编写NSPredicate。

2 个答案:

答案 0 :(得分: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然后进行过滤。 如果您只想要setPropertiesToFetch而不是事件,请不要忘记occuranceoccurance。这将返回NSDictionary

答案 1 :(得分:0)

您必须知道,有两种方法可以获取您的Occurrence对象:您可以从Event对象(即myEvent.occurences)遍历关系,或者您可以为所有具有该对象的事件创建获取请求对他们的反向关系感兴趣的事件,即像[NSPredicate predicateWithFormat:@"event == %@", myEvent"]这样的谓词。

这两者存在根本区别。获取请求将始终导致执行SQL并发生I / O,这是昂贵的。如果你只是遍历关系,你处于Occurrence对象已经在内存中的情况,那么它将非常便宜(没有SQL,没有I / O)。另一方面,获取请求将允许您一次性对所有对象进行故障,而遍历将一次只有一个故障对象,因此您最终将执行多个SQL + I / O事件。此外,获取请求允许您进一步限制谓词。但在许多情况下,简单的遍历可能是最好的情况。

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

我希望这会有所帮助。