【问题标题】:Core Data - complex fetch核心数据 - 复杂的获取
【发布时间】:2014-03-24 22:49:31
【问题描述】:

这是我的核心数据模型:

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. 会议至少有 1 个私人活动。
2. 会议至少有 5 个公共活动。
3. 应根据最近10天计算

我不确定是否应该直接查询 Conference 对象或查询 Event 对象,然后使用 event.conference 过滤适当的会议

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

【问题讨论】:

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


    【解决方案1】:

    您可以在单个提取请求中使用 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)。在这种情况下,您应该在 fetch 之后对结果进行排序和限制。

    【讨论】:

    • 顺便说一句,排序应该只根据“公共”事件,我需要在排序之前过滤数组吗?还是有更有效的方法?
    • 如果您使用 SQLite 存储,恐怕无法使用 NSFetchRequest 做到这一点。您可以使用NSSortDescriptor 的方法'sortDescriptorWithKey:ascending:comparator:' 对获取后的数组进行排序。或者,您可以将附加属性 publicEventsCount 添加到您的 Conference 实体,并在每次向会议添加或删除事件对象时更新它。您应该能够使用此属性通过 fetch 请求进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多