Базовое отношение «1-ко-многим»: список всех связанных объектов в виде заголовка раздела в UITableView - PullRequest
2 голосов
/ 25 февраля 2010

Я борюсь с Core Data на iPhone по поводу следующего: У меня есть отношение 1-ко-многим в Базовых данных. Предположим, что сущности называются рецепт и категория. Категория может иметь много рецептов. Я выполнил все перечисленные рецепты в UITableView с заголовками разделов, названными в честь категории. Чего я хочу добиться - перечислить все категории в заголовке раздела, даже те, которые не имеют рецепта:

category1   <--- this one should be displayed too
category2
     recipe_x
     recipe_y
category3
     recipe_z

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

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
 [fetchRequest setEntity:entity];
 [fetchRequest setFetchBatchSize:10];

 NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.categoryName" ascending:YES];
 NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"recipeName" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];

 [fetchRequest setSortDescriptors:sortDescriptors];
 NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.categoryName" cacheName:@"Recipes"];

Какой самый элегантный способ добиться этого с базовыми данными?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Разделы на самом деле не предназначены для отображения, если в них нет строк. Так устроен UITableView. Если бы вы действительно хотели его форсировать, вам нужно было бы добавить логику к вашему вызову источника данных -numberOfRowsForSection:, чтобы показать, что всегда есть одна строка, а затем вы можете поиграть с -heightForRowAtIndexPath:, чтобы скрыть строку.

Сказав это, это ужасная идея. Позвольте секциям скрыться, как они были предназначены.

0 голосов
/ 28 апреля 2010

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

[fetchRequest setIncludesSubentities:YES];

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

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