NSFetchResultController - 一对多的关系

时间:2013-11-25 05:48:23

标签: ios objective-c core-data nsfetchedresultscontroller

我有四张桌子。这是我的表结构

Master> ---->>项目> ---->>任务> ---->文献

我正在使用NSFetchResultController从数据库中获取对象。任务根据项目的任务数加载到tableview中。 (目前只有一个项目)

我可以使用以下代码来获取任务对象

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Tasks" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"taskId" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

 NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:context sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

返回任务数量,我可以像这样使用。

id  sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];

但我需要使用顶级对象,如Master - >>项目 - >>任务。如何实现顶级对象,而不是使用FetchResultController中的“任务”。

即,

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription
                                       entityForName:@"Master" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];

我在master中没有任何id可以排序。师父与项目有很多关系。

1 个答案:

答案 0 :(得分:0)

没有属性的实体是一个糟糕的设计决策。属性用于区分各种对象,而没有这意味着您实际上只有一个“主”对象,并且所有“项目”实例都与此相关。

所以,我想提出的第一点是删除Master实体,只有“Project”和“Task”

如果由于某种不明原因你想保留“主人”。以下是访问单个对象的方法。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Master"];
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

返回的数组将包含主对象,您可以使用它来访问任务,如下所示

Master *master = [results lastObject];
NSSet *tasks = master.projects.tasks;