【问题标题】: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"。

标签: objective-c uitableview core-data nsfetchedresultscontroller


【解决方案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 的文档中复制它们)。你能更新你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多