核心数据 - 复杂的获取

时间:2014-02-23 12:11:56

标签: ios iphone objective-c core-data nsfetchrequest

这是我的核心数据模型:

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过滤相应的会议

效率很重要,因此如果可能,请使用获取限制或其他优化。

1 个答案:

答案 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)。在这种情况下,您应该在获取后对结果进行排序和限制。