2

エンティティ ビデオを含む既存のコア データ モデルがあります。アプリを更新し、Project というオブジェクトに別のエンティティを追加したいと考えています。コア データ ライト マイグレーションを使用してこれを達成したようです。

今、私はビデオをプロジェクトの子にしたいと考えています。最後に、UITableView で、プロジェクトをセクション ヘッダーとして、ビデオを行として表示したいと思います。

それを達成するための最良の方法は何ですか?現在、NSFetchedResultsController を使用してコア データをクエリしています。ありがとうございました

4

1 に答える 1

2

私が間違っていなければ、軽量の移行を使用してこの種の変更を実現できます。Project エンティティと Video エンティティの間に 1 対多の順序付けられた関係を作成する必要があります。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 オブジェクトを設定して、「ビデオ」関係をプリフェッチします。これにより、ビデオ エンティティにアクセスする際の時間が節約されます。次に、Project エンティティのリストを取得した後、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 に答える