NSFetchedResultsController来自多个实体并更新模型

时间:2013-05-09 19:48:21

标签: ios core-data

我有现有的具有实体视频的核心数据模型。 我想更新一个应用程序,我想在名为Project的对象中添加另一个实体。 似乎我使用核心数据光迁移实现了这一点。

现在我想视频成为项目的孩子。最后在UITableView中,我想将Projects显示为Section标题,将Videos显示为行。

实现它的最佳方法是什么? 目前我正在使用NSFetchedResultsController来查询核心数据。 谢谢

1 个答案:

答案 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];
...
}