NSFetchedResultsController / Parent-Child - PullRequest
       27

NSFetchedResultsController / Parent-Child

5 голосов
/ 20 декабря 2011

Я работаю над своим первым приложением с поддержкой 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;
}    

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

1 Ответ

2 голосов
/ 20 декабря 2011

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

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

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

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

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

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

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

...