我有现有的具有实体视频的核心数据模型。 我想更新一个应用程序,我想在名为Project的对象中添加另一个实体。 似乎我使用核心数据光迁移实现了这一点。
现在我想视频成为项目的孩子。最后在UITableView中,我想将Projects显示为Section标题,将Videos显示为行。
实现它的最佳方法是什么? 目前我正在使用NSFetchedResultsController来查询核心数据。 谢谢
答案 0 :(得分:2)
如果我没弄错的话,你可以使用轻量级迁移实现这种改变。您必须在Project实体和Video实体之间创建一对多的有序关系。您仍然可以使用NSFetchedResultsController来获取项目列表,然后遍历与Video实体的关系以获取关联的对象。看起来或多或少会像这样:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext: context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setRelationshipKeyPathsForPrefetching: @"videos"];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
initWithFetchRequest: fetchRequest
managedObjectContext: context
sectionNameKeyPath: nil
cacheName: nil];
我们正在设置一个NSFetchRequest对象来预取“视频”关系,这将为我们节省访问视频实体的时间。然后,在检索项目实体列表后,您将在 tableView:cellForRowAtIndexPath:
中访问它们- (NSInteger) numberOfSectionsInTableView: (UITableView*) tableView
{
return [self.fetchedResultsController.fetchedObjects count];
}
- (NSInteger) tableView: (UITablView*) tableView numberOfRowsInSection: (NSInteger) section
{
Project *project = [self.fetchedResultsController.fetchedObjects objectAtIndex: section];
return [project.videos count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
Project *project = [self.fetchedResultsController.fetchedObjects objectAtIndex: indexPath.section];
Video *video = [project.videos objectAtIndex: indexPath.row];
...
}