Разделы от уже запрошенной сущности - PullRequest
2 голосов
/ 05 сентября 2011

Так что я отображаю некоторые сущности в UITableView.Нажав на ячейку, я хочу показать другим сущностям, которые уже запрошены в отношении «ко многим».

Например, я отображаю все классы школы.Теперь я хочу показать всех учеников класса.Эти студенты уже доступны как NSSet в Class.students

Теперь я хочу отобразить студентов в разных разделах, следующих за их первым письмом.

Если я хочу получить их напрямую отCoreData, я бы сделал что-то вроде

// init fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.managedObjectContext];

// Search only specific students
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"class == %@", theClassThoseStudentsBelongTo];
[fetchRequest setPredicate:predicate];

// Generate it
NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                        managedObjectContext:self.managedObjectContext 
                                          sectionNameKeyPath:@"firstLetter" 
                                                   cacheName:@"StudentTable"];

с помощью этого метода, я бы аккуратно разбил их на разделы.

Но у меня уже есть все ученики для определенного класса.Есть ли способ инициализировать NSFetchedResultsController с инициализированным NSSet или сделать что-то равное?

Конечно, я могу настроить свой NSSet вручную, но разве нет такого приятного способа, как для нового запроса?

заранее спасибо.Пожалуйста, оставьте комментарий, если что-то неясно.

Ответы [ 3 ]

1 голос
/ 11 сентября 2011

Полагаю, у вас есть только 2 варианта: использовать NSFetchedResultsController или сортировать объекты самостоятельно.

NSFetchedResultsController & NSPredicate:
Плюсы: легкое удаление объектов; уведомления об изменениях модели, например, во время синхронизации
Минусы: ненужное повторное получение

NSSet & NSSortDescriptor
Плюсы: нет повторной загрузки Минусы: сложное удаление; нет уведомлений об изменениях модели, например, во время синхронизации: вы можете отображать уже удаленного ученика

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

Отношения объектов, выбранных NSFetchedResultsController, начинаются как ошибки и выбираются только при необходимости.Это означает, что если мы не будем использовать сущности "Student" для первого tableView, он будет загружен лениво только тогда, когда он нам нужен.

Однако, поскольку вам нужно знать количество студентов, ситуациянемного сложнее, так как вызов [class.students count] вызовет ошибку.(Вызов KVO @count также вызовет ошибку).

Таким образом, у вас есть два варианта:

  1. управляет атрибутом StudentsCount в классе, который отражает количество сущностей в учениках.Вызов этого атрибута не вызовет ошибку в отношении.
  2. use countForFetchRequest:

    NSFetchRequest *req = [[NSFetchRequest alloc] init];
    [req setEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]];
    [req setPredicate:[NSPredicate predicateWithFormat:@"class = %@", myClass]];
    

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

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

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

вы можете использовать NSPredicate, который использует обратную связь (от ваших учеников обратно в класс)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
...

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"class == %@", theClassThoseStudentsBelongTo];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *theFetchedResultsController = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...