Как я могу использовать NSFetchedResultsController для получения результатов, основанных на связи объекта? - PullRequest
1 голос
/ 05 сентября 2011

У меня есть 2 представления, каждый из которых содержит UITableView. Они оба отображаются одновременно на iPad.

Я использую базовые данные для всех данных. Обе таблицы должны быть отредактированы (добавлены строки, удалены и т. Д.), Поэтому я хотел бы использовать NSFetchedResultsController в каждом представлении, чтобы обработать все это для меня.

Содержимое второй таблицы зависит от того, что выбрано в первой таблице. Итак, при выборе элемента в первой таблице этот объект передается в представление со второй таблицей (поэтому у меня уже есть доступ к данным, которые должны попасть во вторую таблицу), но я хотел бы попытаться использовать вся встроенная обработка NSFRC, если это возможно.

Модель соответствует следующим направлениям: университет (uniID, uniName, студенты) и студент (stuID, stuName, университет). Итак, отношения таковы: университет <- >> студент.

Я использую следующий код в NSFRC, но он возвращает 0 результатов:

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

NSManagedObjectContext *context = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"stuName" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

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

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return fetchedResultsController;    

}

Я был бы очень признателен, если бы кто-то мог хотя бы указать мне правильное направление ...

Ответы [ 3 ]

0 голосов
/ 06 сентября 2011

Хорошо, я решил проблему. NSFRC не обновлялся, когда предикатный термин, необходимый для изменения (т. Е. Был выбран университет), конечно, из-за:

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

Повторное создание NSFRC при каждом вызове (путем удаления приведенного выше кода) также не работает, поскольку выборка должна выполняться после того, как она была создана, что не может произойти непосредственно перед вызовом numberOfRowsInSection (как этот метод вызывает и, следовательно, воссоздает NSFRC).

Итак, я добавил BOOL в представление с именем newFetchRequired, которое устанавливается в YES каждый раз, когда выбирается новый университет. В NSFRC вышеуказанный код должен быть изменен на:

if (fetchedResultsController != nil && !newFetchRequired) {
        return fetchedResultsController;
    }
newFetchRequired = NO;

Затем выборка выполняется правильно (что вызывает и воссоздает NSFRC):

[self.fetchedResultsController performFetch:&error];

Надеюсь, это поможет любому в подобной ситуации.

Спасибо Эшли за альтернативное предложение.

0 голосов
/ 09 сентября 2011

Я не знаю, проверяете ли вы это по-прежнему, и я не совсем уверен, правильно ли я понял ваш вопрос ... но почему вы создаете NSFRC с нуля, когда вы просто хотите изменить предикат?Вот как я бы это сделал:

Когда выбран новый университет, просто добавьте код прямо здесь:

NSFetchRequest *fetchRequest = [self.fetchedResultsController fetchRequest];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"university == %@",self.selectedUniversity];

[fetchRequest setPredicate:predicate];

NSError *error;
[fetchedResultsController performFetch:&error];

и все готово.(Извините, если это совсем не то, что вы искали).

edit: Вы также можете просто написать это в частную функцию и вызывать ее каждый раз, когда выбирается университет.

0 голосов
/ 05 сентября 2011

Вы помнили performFetch:?

т.е.

NSError *error;
BOOL success = [fetchedResultsController performFetch:&error];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...