Контроллер результатов извлечения базовых данных и настраиваемый заголовок раздела

StackOverflow https://stackoverflow.com/questions/2353924

Вопрос

Я знаком с обычным и базовым использованием NSFetchedResultsController, управляющим строками таблицы, но у меня возникла интересная проблема.

Мои данные организованы следующим образом:Расписание <--->> День <--->> Маршрут.В настоящее время у меня есть табличное представление с расписаниями с контроллером выборки, управляющим созданием и удалением расписаний.Теперь я хочу создать табличное представление для маршрутов/дней.

Я хотел бы указать маршрут в каждой строке и создать настраиваемые заголовки разделов, соответствующие информации в соответствующем дне.Вероятно, я мог бы взломать что-нибудь вместе, выбрав все маршруты, а затем разделив их по обратной зависимости от соответствующего дня, но я беспокоюсь, что тогда я не смогу воспользоваться методами делегата контроллера выборки для обновления таблицы, когда управляемые объекты изменяются.

Есть ли у кого-нибудь опыт в этом вопросе?Есть идеи, как двигаться дальше?

Спасибо.

Это было полезно?

Решение

NSFetchedResultsController предназначен для этой цели, поэтому вам не придется изобретать велосипед.

Когда вы инициализируете свой NSFetchedResultsController, вам следует рассмотреть возможность указания разделаNameKeyPath.Это свойство — именно то, что вам нужно для автоматического создания раздела.

В вашем случае я бы сделал следующее:

NSEntityDescription: @"Route"
NSPredicate: @"day = %@"
NSFetchedResultsController: sectionNameKeyPath:@"route.day"

Вы понимаете, что я имею в виду, если вам нужно больше кода для пояснения, скажите мне.

Другие советы

Вам необходимо изучить связь «Ко многим» с помощью NSSet, созданного для представления пути «Маршрут->>День» в вашей базе данных.Предположим, вы назвали свои отношения isTraversedOn, а день->Расписание — isScheduled, это будет что-то вроде:

Route *route=[self.fetchedResultsController.fetchedObjects objectAtIndex:0];
for (Day *day in route.isTraversedOn) {
   Schedule *schedule = day.isScheduled;
   NSLog(@"route is traversed on %@ according to schedule %@",day.name,schedule.name);
}

NSSet просто сохраняет фактические идентификаторы указанных объектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top