我有现有的具有实体视频的核心数据模型。我想更新一个应用程序,我想向名为 Project 的对象添加另一个实体。看来我是使用核心数据轻迁移实现的。
现在我想视频成为该项目的孩子。最后在 UITableView 中,我想将项目显示为节标题,将视频显示为行。
实现它的最佳方法是什么?目前我正在使用 NSFetchedResultsController 来查询核心数据。谢谢你
如果我没记错的话,您可以使用轻量级迁移来实现这种更改。您必须在 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];
...
}