Ios 对多个关系的谓词

Ios 对多个关系的谓词,ios,cocoa-touch,core-data,Ios,Cocoa Touch,Core Data,我有一个托管对象引用*事件 一个事件有很多次发生。事件具有属性调用date 我要获取事件*事件的所有事件,该事件具有今天的日期。我应该如何对FetchRequest编写NSPredicate 这里是谓词的构造,用于过滤掉今天发生的事件 NSDate *today = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSG

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

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


我要获取事件*事件的所有事件,该事件具有今天的日期。我应该如何对FetchRequest编写NSPredicate

这里是谓词的构造,用于过滤掉今天发生的事件

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];
NSDate*today=[NSDate-date];
NSCalendar*格里高利=[[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents*components=[公历成分:(NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit)fromDate:today];
[组件设置小时:0];
[组件设置分钟:0];
[组件设置秒:0];
NSDate*todayMidnight=[gregorian dateFromComponents:components];
#定义小时数\u 24 86400
NSDate*tomorrowMidnight=[NSDate-dateWithTimeInterval:Hours_24 sinceDate:today midnight];
NSPredicate*谓词=[NSPredicate谓词格式:@“occurance.date>=%@和occurance.date<%@”,今天午夜,明天午夜];
[公历释放];
由于
occurrence
的属性是
NSDate
数据类型,因此它既有时间也有日期。因此,这个谓词将过滤掉所有日期介于今天午夜和明天午夜之间的
事件。另一种方法(在我看来更好)是获取
发生次数
,然后进行过滤。
如果只需要
发生
而不需要事件,请不要忘记
setPropertiesToFetch
:到
发生
。这将返回一个
NSDictionary

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

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

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

我希望这有帮助