这是我的核心数据模型:
Conference
==========
name
events (to-many relationship to Event object)
Event
======
date
type (int - private=0, public=1)
conference (to-one relationship to Conference object)
所以 session 可以有很多事件,而事件只有一个 session :
Conference <------>> Event
我有一个复杂的提取,我不确定该怎么做,这就是我需要的:
公开事件最多且满足基本条件的3个顶级 session ,意思是:
1. session 至少有1个私有(private)事件。
2. session 至少有5个public event。
3.应该是根据最近10天计算
我不确定是应该直接查询 Conference
对象还是查询 Event
对象然后使用 event.conference 过滤适当的 session
效率很重要,所以如果可能的话使用获取限制或其他优化。
最佳答案
您可以使用 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 )。在这种情况下,您应该在获取后对结果进行排序和限制。
关于ios - 核心数据 - 复杂获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21968032/