这是我的核心数据模型:
Conference
==========
name
events (to-many relationship to Event object)
Event
======
date
type (int - private=0, public=1)
conference (to-one relationship to Conference object)
所以会议可以有很多活动,活动只有一个会议:
Conference <------>> Event
我有一个复杂的提取,我不知道该怎么做,这就是我需要的:
3个顶级会议,公开活动最多,符合基本条件,含义:
1.会议至少有一场私人活动
2.会议至少有5次公开活动
3.应根据过去10天计算
我不确定是应该直接查询Conference
个对象还是查询Event
个对象,而不是使用event.conference过滤相应的会议
效率很重要,因此如果可能,请使用获取限制或其他优化。
答案 0 :(得分:2)
您可以使用SUBQUERY在单个提取请求中执行此操作:
NSDateComponents* components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]];
[components setDay:[components day] - 10];
NSDate* tenDaysAgo = [[NSCalendar currentCalendar] dateFromComponents:components];
NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Conference class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(events, $event, $event.type = 0 AND $event.date > %@).@count >= 1 AND SUBQUERY(events, $event, $event.type = 1 AND $event.date > %@).@count >= 5", tenDaysAgo, tenDaysAgo];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"events.count" ascending:NO];
fetchRequest.fetchLimit = 3;
注意:使用events.count的排序描述符仅适用于内存存储或二进制存储,但它会因SQLite存储而崩溃(更多关于它here)。在这种情况下,您应该在获取后对结果进行排序和限制。