2

我有现有的具有实体视频的核心数据模型。我想更新一个应用程序,我想向名为 Project 的对象添加另一个实体。看来我是使用核心数据轻迁移实现的。

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

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

4

1 回答 1

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];
...
}
于 2013-05-09T20:35:47.640 回答