核心数据-复杂的获取 [英] Core Data - complex fetch

查看:93
本文介绍了核心数据-复杂的获取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的核心数据模型:

This is my core data model:

Conference
==========
name

events (to-many relationship to Event object)

Event
======
date
type (int - private=0, public=1)

conference (to-one relationship to Conference object)

所以会议可以有很多事件,而事件只有一个会议:

So conference can have many events, and event has only one conference:

Conference <------>> Event

我有一个复杂的提取操作,不确定该怎么做,这就是我需要的:

I have a complex fetch that I'm not sure how to do, this is what I need:

前3个公开事件最多的会议,并且满足基本条件,这意味着:

1.会议至少有1个私人事件。

2.会议至少有5个公共事件。

3.应该根据最近10天计算

The 3 top conferences with the most public events AND meet the basic conditions, meaning:
1. conference has at least 1 private event.
2. conference has at least 5 public event.
3. should be calculated based on the last 10 days

我不确定是直接查询会议对象还是查询 Event 对象,然后过滤相应的会议使用event.conference

I'm not sure if I should query the Conference objects directly or query the Event objects and than filter the appropriate conferences using event.conference

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

Efficiency is important, so if possible to use fetch limit or other optimization.

推荐答案

您可以在单个获取请求中使用SUBQUERY进行操作:

You can use SUBQUERY to do it in a single fetch request:

 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存储会崩溃(有关它的更多信息,请此处 )。在这种情况下,您应该在提取后对结果进行排序和限制。

NOTE: sort descriptor with events.count will only work for in-memory store or binary store, but it will crash for SQLite store (more about it here). In this case you should sort and limit results after the fetch.

这篇关于核心数据-复杂的获取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆