NSFetchedResultsController的GROUP BY等效谓词

时间:2012-11-25 10:30:40

标签: iphone objective-c core-data

我正在尝试使用适当的NSFetchedRequest来查询给定电视节目的下一个未观看过的剧集。 它应该放在一个请求中,因为我必须将它交给NSFetchedResultsController。

My Model (CoreData):
 Show
   - Seasons:NSSet<Show>
 Season
   - Episodes:NSSet<Episode>
 Episode
   - first_aired:NSDate
   - watched:BOOL

每个节目都应该返回1(或0)集。

我可以将它与多个请求放在一起。

例如: 我将NSFetchedResultsController设置为每show次抓取一次。 在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中,我遍历每个Show以获取最新的episode

+(Episode *)nextAiringEpisodeForShow:(Show *)show{


    NSTimeInterval timeinterval = 0.0;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeinterval];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Episode"];
    request.predicate = [NSPredicate predicateWithFormat:@"season.show = %@ AND watched = false AND season.seasonNumber > 0 AND first_aired > %@",show,date];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"first_aired" ascending:NO];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    return  [[show.managedObjectContext executeFetchRequest:request error:nil] lastObject];
}

这样做的问题: 有节目已经观看了所有剧集。 这些内容将在(null)中显示为UITableView,并且无法将其从UITableView中移除,因为NSFetchedResultsController已设置为dataSource。 此外,当以这种方式执行时,无法按TableView排序first_aired。 或者我在这里遗漏了什么?!

1 个答案:

答案 0 :(得分:0)

您可以仅获取至少有一个未观看过的剧集的节目,而不是获取所提取的结果控制器中的所有节目。这应该与以下谓词一起使用(对于“Show”上的获取请求):

[NSPredicate predicateWithFormat:@"SUBQUERY(seasons, $x, ANY $x.episodes.watched == FALSE).@count > 0"]