繁体   English   中英

对多关系的谓词

[英]Predicate on to-many relationship

我有一个托管对象参考* event。

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

我想获取具有今天日期的所有事件* event。 我应该如何在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];

由于属性occuranceNSDate类型,但将有时间和日期。 因此,该谓词将筛选出日期介于今天午夜和明天午夜之间的所有occurances 另一种方法(我认为更好)是获取Occurances ,然后进行过滤。 不要忘了setPropertiesToFetch :以occurance ,如果你只想要occurance ,而不是事件。 这将返回一个NSDictionary

您必须知道,有两种方法可以获取Occurrence对象:您可以遍历Event对象的关系(即myEvent.occurences ),也可以为所有与事件相关的事件创建获取请求逆关系,即谓词,例如[NSPredicate predicateWithFormat:@"event == %@", myEvent"]

这两者之间存在根本差异。 提取请求将始终导致执行SQL和发生I / O,这非常昂贵。 如果仅遍历关系, 并且您处于Occurrence对象已在内存中的情况下,这样做将非常便宜(没有SQL,没有I / O)。 另一方面,提取请求将允许您一次对所有对象进行故障处理,而遍历一次将仅对一个对象进行故障处理,因此最终将导致执行多个SQL + I / O事件。 同样,获取请求允许您进一步限制谓词。 但是在许多情况下,最好仅遍历遍历。

CoreData为您完成了很多繁重的工作,但最终,您仍然需要了解何时执行SQL和I / O以及如何防止它。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM