ios - 核心数据 - 复杂获取

标签 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)

所以 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/

相关文章:

objective-c - iOS 6 - UIWebView loadHTMLString 无法正常工作

ios - Swift - 从 DetailViewController 访问 UITextView

ios - 访问 iBooks 库 (iOS)

javascript - 是否有适用于 iOS 和 Android 浏览器的性能指南?

iphone - 为什么我的 XCode 单元测试根本不起作用?

iphone - AutoLayout 为多个 View 设置相同的高度和顶部空间,而不是垂直分布

objective-c - 未调用 UIPickerViewDelegate 方法

ios - UITableViewCell 中的 UITextField 唯一性

iOS UI 没有显示它应该在的位置

objective-c - 如何在 Mac 上获取电源使用情况