4

Я работаю над своим первым приложением с поддержкой Core Data, и мне трудно понять, как правильно настроить NSFetchedResultsController. У меня есть две сущности:NSFetchedResultsController/Parent-Child

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

у меня есть две точки зрения (каждый наследует от UITableViewController и каждый подкреплены NSFetchedResultsController). Первый вид - UITableView, который отображает все элементы List. Когда строка выбрана, она перемещает второй вид.

У меня есть свойство в контроллере вида @property (strong, nonatomic) List *selectedList, который я назначаю с выбранным List, прежде чем нажимать вид.

У меня возникли проблемы с настройкой второго взгляда только с отображением объектов 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

Вам необходимо установить NSPredicate, чтобы выбрать ListItem с, где selectedList соответствует их list.

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

Там одна вещь, чтобы быть в курсе здесь, и это то, что предикат будет меняться в зависимости от selectedList значения, что запрос на выборку изменится. Если вы измените запрос на выборку, Apple сообщит об этом в NSFetchedResultsController Class Reference.

Вы не можете просто изменить запрос выборки, чтобы изменить результаты. Если вы хотите изменить запрос выборки, вы должны:

  1. Если вы используете кэш, удалить его (используя +deleteCacheWithName:).

  2. Как правило, вы не должны использовать кеш, если вы меняете запрос на выборку.

  3. Измените запрос на выборку. Вызов -performFetch:.