0

我正在开发一个应用程序,我想在其中显示一个充满学生项目的 UITableView。每个项目实体都有几个属性,如标题、描述等,并且还与其他实体(如学生、学习课程等)的关系相关联。我现在要做的是,将学习课程用作部分,其中包含该学习课程的学生所做的所有相应项目。

到目前为止,我的代码看起来像这样

    - (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController =
        [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:self.managedObjectContext
            sectionNameKeyPath:Nil
            cacheName:Nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    return _fetchedResultsController;
}

这是 CoreData 模型的屏幕截图核心数据截图

我对 Obj-C 真的很陌生,并且自己还没有设计数据模型,所以我有点迷失在这里,很高兴能得到任何帮助。

4

1 回答 1

0

你还没有问一个具体的问题,但我可以给你一些基本的方向。您创建NSFetchedResultsController外观的方式是正确的,除了您需要再做两件事:按课程标题对结果进行排序并将课程标题设置为sectionNameKeyPath(我假设您的Studycourse实体有一个title属性,但根据需要替换另一个属性)。

- (NSFetchedResultsController *)fetchedResultsController
{
    ...

    NSSortDescriptor *courseTitleSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"projecttostudycourse.title" ascending:YES];
    NSSortDescriptor *titleSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
    NSArray *sortDescriptors = @[courseTitleSortDescriptor, titleSortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.managedObjectContext
                                          sectionNameKeyPath:@"projecttostudycourse.title"
                                                   cacheName:Nil];

    ...
}

请注意,通过提供两个分类描述符,项目将首先按课程组织,然后在每个课程中按项目标题进行组织。另一件值得注意的事情是关键路径使用点表示法来遵循实体关系。因此,从项目实体获取课程名称的方法是@"projecttostudycourse.title".

于 2013-11-13T18:51:10.413 回答