2014-02-23 105 views
1

這是我的核心數據模型:核心數據 - 復取

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. c推論至少有1個私人事件。
2.會議至少有5個公共活動。
3.應根據最近10天來計算

我不知道我是否應該直接查詢Conference對象或查詢Event對象和使用event.conference

效率比過濾的相應會議是重要的,所以如果可能的話使用讀取限制或其他優化。

回答

2

您可以使用子查詢來做到這一點在一個單一的讀取請求:

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 > %@)[email protected] >= 1 AND SUBQUERY(events, $event, $event.type = 1 AND $event.date > %@)[email protected] >= 5", tenDaysAgo, tenDaysAgo]; 
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"events.count" ascending:NO]; 
    fetchRequest.fetchLimit = 3; 

注意:與events.count排序描述符將只在內存中存儲或二元店工作,但它會崩潰爲SQLite商店(更多關於它here)。在這種情況下,您應該在提取後對結果進行排序和限制。

+0

非常感謝! – Eyal

+0

btw,排序應該只根據「公共」事件,我需要在排序之前過濾數組嗎?還是有更有效的方法? – Eyal

+0

如果你使用SQLite存儲,恐怕沒有辦法用NSFetchRequest來做到這一點。您可以在使用'NSSortDescriptor'的方法'sortDescriptorWithKey:ascending:comparator:'進行提取後對數組進行排序。或者,您可以將附加屬性'publicEventsCount'添加到''Conference'實體,並在每次向會議添加或刪除一個Event對象時更新它。您應該可以使用此屬性對提取請求進行排序。 –