NSFetchedResultsController/Родитель-потомок

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

/-----------\        /-----------\
| 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;
}    

Нужно ли мне добавить какой-то дескриптор сортировки, или ответ заключается в чем-то другом? Спасибо!


person Fred Jenkins    schedule 19.12.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

person Mark Adams    schedule 19.12.2011