Обход отношений «один ко многим» с помощью NSFetchedResultsControllers

Я создаю приложение, которое перемещается по нескольким уровням отношений «один ко многим». Например, представьте, что CoreDataBooks начинается со списка жанров, вы нажимаете на жанр и затем получаете список книг, упорядоченный по авторам, как показано в примере кода Apple.

Вот моя проблема: документация Apple говорит мне, что я должен использовать FetchedResultsController, чтобы организовать мой список книг по разделам (помимо других причин). Но при попытке выяснить, как перейти от одного жанра ко многим моим книгам, часто задаваемые вопросы по Core Data советуют не использовать выборку. Из часто задаваемых вопросов:

У меня есть отношение «ко многим» между сущностью A и сущностью B. Как мне получить экземпляры сущности B, связанные с данным экземпляром сущности A?

Вы не знаете. В частности, нет необходимости явно извлекать целевые экземпляры, вы просто вызываете соответствующее кодирование значения ключа или метод доступа к экземпляру Entity A.

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

Как лучше поступить здесь? Должен ли я следовать FAQ, и если да, то как мне разделить мои книги на разделы по авторам?

Или я использую извлеченный контроллер результатов (который, как я подозреваю, лучше), и в этом случае, как мне пройти через отношения «один ко многим» (поскольку очень полезный ответ Apple просто не надо)?

Большое спасибо за вашу помощь.

Саша


person Sasha    schedule 07.06.2011    source источник


Ответы (1)


У вас есть модель данных, которая выглядит примерно так:

Genre{
  name:
  books<-->>Book.genre
}

Book{
  name:
  genre<<-->Genre.books
}

В вашей основной таблице вы запускаете полученный контроллер результатов, чтобы получить таблицу из Genre объектов. Затем пользователь выбирает одну из строк, которая за кулисами выбирает конкретный объект Genre.

Поскольку каждый объект Genre имеет отношение books, указывающее на связанные объекты Book, вы автоматически получаете ссылку на все связанные объекты книги, поэтому вам не нужно ничего извлекать. Для табличного представления вашей книги вы просто создаете отсортированный массив объектов Book в отношении books выбранного объекта Genre.

Думайте о графе объекта Core Data как о комке нитей бусинок, сплетенных вместе в паутину или ткань. Бусины — это объекты, а нити — отношения. При извлечении вырывается одна из бусинок/объектов из комка, но как только эта бусина/объект окажется в вашей руке, вы можете просто потянуть за ее нить/связь, чтобы вытащить все бусины/объекты, связанные с бусиной в вашей руке.

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

Вот почему в документах Apple говорится, что вам не нужна вторая выборка.

person TechZen    schedule 07.06.2011