4

私は最初のCore Data-backedアプリケーションを開発中で、NSFetchedResultsControllerを正しく設定する方法がわかりません。NSFetchedResultsController/Parent-Child

/-----------\  /-----------\ 
| List  |  | ListItem | 
| --------- |  | --------- | 
| listName |  | itemName | 
| --------- |  | --------- | 
| listItems |<---->> | list  | 
\ ---------/  \ ---------/

私は2つのビューを(それぞれがUITableViewControllerから継承し、それぞれがNSFetchedResultsControllerが付いています)があります。私は2つのエンティティを持っています。最初のビューは、Listのすべてのアイテムを表示するUITableViewです。行が選択されると、2番目のビューがプッシュされます。

ビューコントローラには、ビューをプッシュする前に、選択したListで割り当てる@property (strong, nonatomic) List *selectedListというプロパティがあります。

設定に問題があるのは、2番目のビューには、親が選択されているListItemオブジェクトのみが表示されていることです。List私はこれがNSFetchedResultsControllerのどこかに属していることを知っていますが、私はどこかには分かりません。

は、ここに私のコードです:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    // Set up the fetched results controller. 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Detail"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return __fetchedResultsController; 
}  

私はソート記述子のいくつかの並べ替えを追加する必要がある、または何か他のものとの回答うそをしていますか?ありがとう!

答えて

1

あなたはselectedListが自分listプロパティと一致するListItem Sを選択するNSPredicateを必要としています。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list == %@", self.selectedList]; 
[fetchRequest setPredicate:predicate]; 

あり、ここで注意すべき一つのことだ、それは述語がフェッチ要求が変わることを意味selectedListに応じて変化することです。フェッチ要求を変更する場合、AppleはNSFetchedResultsController Class Referenceにこの警告を表示します。

フェッチ要求を変更して結果を変更することはできません。あなたはフェッチ要求を変更したい 場合、次の条件を満たす必要があります。

  1. あなたはキャッシュを使用している場合は、(+deleteCacheWithName:を使用して)それを削除します。

  2. 通常、フェッチ要求を変更する場合は、キャッシュを使用しないでください。

  3. フェッチ要求を変更します。 -performFetch:を呼び出します。