具有自定义核心数据模型的部分名称键路径

Posted

技术标签:

【中文标题】具有自定义核心数据模型的部分名称键路径【英文标题】:sectionNameKeyPath with custom CoreData model 【发布时间】:2013-11-12 01:06:03 【问题描述】:

我正在开发一个应用程序,我想在其中显示一个充满学生项目的 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 的新手,而且我自己还没有设计数据模型,所以我有点迷路了,很高兴能得到任何帮助。

【问题讨论】:

我不是 Core Data 的大师,但 sectionNameKeyPath: 将是 Project 的一个属性(或关系),每个部分都是一门学习课程。看起来您有一个名为“projectToStudyCourse”的关系,因此您可以将 sectionKeyPath: 设置为 @"projecttostudycourse.title",其中 title 是学习课程标题的属性名称。当然,将部分标题设置为学习课程标题。此外,您需要将 sortDescriptor 更改为 @"projecttostudycourse.title"。 【参考方案1】:

您尚未提出具体问题,但我可以为您提供一些基本方向。您创建NSFetchedResultsController 的方式看起来是正确的,只是您需要再做两件事:按课程标题对结果进行排序并将sectionNameKeyPath 设置为课程标题(我假设您的Studycourse 实体有一个@ 987654325@ 属性,但根据需要替换其他属性)。

- (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"

【讨论】:

非常感谢!这已经很有帮助了。现在我只是得到一些我无法解释的奇怪行为。我有一个示例项目,它出现在每个部分中,一些项目正在重复,而另一些则根本没有显示:Simulator screenshot 需要您更新的代码以及cellForRowAtIndexPathNSFetchedResultsControllerDelegate 方法(除非您完全从Apple 的文档中复制它们)。你能更新你的问题吗?

以上是关于具有自定义核心数据模型的部分名称键路径的主要内容,如果未能解决你的问题,请参考以下文章

Django模型父链接的自定义相关名称?

如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?

迁移复杂的核心数据模型

具有关系的核心数据模型

根据.net核心中var中的条件插入对象列表/自定义模型列表

具有多个映射模型的复杂核心数据迁移