Базовые данные: можно ли использовать отношения для sectionNameKeyPath? - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь сделать то же самое, что и сообщение в NSFetchResultsController + sectionNameKeyPath + порядок раздела , то есть в основном использовать 2 таблицы, скажем, категории <- >> События.Таблица категорий состоит только из поля категорий, а событие состоит из имени, dateTimestamp.Я определил отношение "категория" в таблице событий и попытался использовать это отношение как sectionNameKeyPath при создании fetchedResultsController:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"category.category" cacheName:@"Root"];

Наконец, я предварительно заполнил таблицу категорий некоторыми категориями при загрузке приложения (и подтвердил с помощью.dump, что таблица заполнена правильно)

Тем не менее, мне не удается выполнить симулятор:

return [[self.fetchedResultsController sections] count];

Я провел расширенный поиск, и большинство людей либо предлагают использовать одно из полей в таблице как sectionNameKeyPath (это работает!) или временное свойство (работает тоже!) Однако я просто хочу использовать отношения, так как мне кажется очень логичным в этом случае, когда события принадлежат некоторым категориям и могут быть категории без событий.Я ошибаюсь в своем предположении, что отношения могут использоваться как sectionNameKeyPath?Исходная ссылка в верхней части вопроса предполагает, что это работает, но парень не знает, почему и как.Документация очень слаба для того, что можно использовать в качестве sectionNameKeyPath, поэтому любая помощь будет высоко оценена.

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Отношение получает указатель на управляемый объект.Однако кажется логичным, что параметр sectionNameKeyPath должен быть ключевым путем, который ведет к строке, поскольку свойство name NSFetchedResultsSectionInfo является строкой.Контроллер извлеченных результатов будет следовать этому ключевому пути для каждого извлеченного объекта и группировать объекты по разделам на основе того, что они возвращают для этого ключевого пути, и он также будет использовать эти строки в качестве имен соответствующих разделов.Вы не можете использовать управляемый объект для имени - вам нужно использовать некоторое строковое свойство управляемого объекта.

Итак, ваша сущность Category должна иметь атрибут, который отличает одну категорию от другой, верно?Используйте его в качестве ключевого пути и (как вы уже видели) все сработает.

Кстати, я думаю, что полезно попытаться выйти из мышления базы данных (строк / полей) и попытаться обдуматьобъектно-ориентированные термины, такие как сущность и атрибут.Основная идея Core Data заключается в том, что он обеспечивает уровень абстракции, который скрывает механизм хранения.Мышление в терминах таблиц - это все равно, что думать о блоках и секторах, когда вы читаете или пишете файл.

0 голосов
/ 12 мая 2011

Калеб, спасибо за ваш ответ.Я верю, что мое понимание было в некоторой степени неверным.То, что у меня было, было Категория сущности и Событие сущности.Категория имеет строковое поле «категория», таким образом, путь «category.category» (первая «категория» - это отношение в сущности «Событие»)

Однако я не учел, что если нетevents, fetchresultscontroller не может ничего извлечь (аналогично «левому соединению»)

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

Что я должен был сделать (неправильно или правильно - пока не уверен), это обработать [управляемый] объект, созданный из объекта Category, как отдельный объект в случае отсутствия событий и места в таблице.Когда в категории есть одно событие, я могу переключиться на оригинальный метод [автоматического] отображения событий, отсортированных по категориям.

Это интересный вопрос о начальной точке (пустые сущности со связями), где, как мне кажется, основные данные более запутанны, чем традиционная база данных взаимоотношений.Я также считаю, что именно поэтому все книги / статьи / отчеты тщательно избегают этой темы.Другими словами, я не смог найти аналог «левого соединения» в основных данных.Может быть, я ошибаюсь, потому что я относительно новичок во всем этом.Ниже приведено описание сущностей:

Категория <- >> Событие

Категория - родительский объект Category.category - атрибут типа String Category.event - отношение к объекту события

Событие - дочерний. Event.name - атрибут типа String Event.category - отношение к объекту категории

Каждое событие относится к одной категории.Категория может иметь несколько событий.Категории должны отображаться, даже если для этой категории нет событий.

Я пытался поместить Events в fetchresultscontroller.Может быть, я должен сначала переключиться на категорию, а затем вычислить ячейку на основе отношения category.event, а не наоборот - пока не пробовал.

...