具有自定义核心数据模型的部分名称键路径
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 需要您更新的代码以及cellForRowAtIndexPath
和NSFetchedResultsControllerDelegate
方法(除非您完全从Apple 的文档中复制它们)。你能更新你的问题吗?以上是关于具有自定义核心数据模型的部分名称键路径的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?