свойства извлеченных данных ядра и NSFetchedResultsController - PullRequest
2 голосов
/ 17 августа 2011

Я прочитал это в руководстве по программированию основных данных:

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

Это имеет смысл, если все связано с одним объектом.

Однако, скажем, у меня есть эта объектная модель и отношения

Company (one to many) Team (one to many) Employee (one to one) Role

Скажем, я загружаю свою Компанию в начале с запросом на выборку. Затем у меня есть доступ к набору команд, и в каждой команде у меня есть набор сотрудников.

(это все гипотетически, но мое приложение следует той же модели)

Я хочу загрузить UITableView, в котором перечислены все сотрудники, имеющие роль «разработчика», и я хочу сделать это с помощью NSFetchedResultsController.

Я хотел бы создать извлеченное свойство в Company, которое возвращает всех «разработчиков». Что достаточно просто.

Как бы я связал это извлеченное свойство с NSFetchedResultsController?

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

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

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

Для обхода отношений вы используете ключевые пути.Например, чтобы найти всех сотрудников конкретной компании в вашей модели, вы должны использовать ключевой путь teams.employees и начать с определенного объекта компании.Чтобы найти разработчиков, вы должны пройти путь до атрибута Role, который содержит значение developer, что-то вроде: team.employees.role.roleType.

В вашем конкретном случае, если вам нужна таблица со всеми разработчиками, вы бы не устанавливали выборку для сущности Company, а для сущности Employee.Вы можете использовать предикат с путем ввода ключа, например role.roleType== developer.Если вам нужны все разработчики в определенной компании, вы должны использовать предикат вроде: `role.roleType == developer AND team.company.name == aCompanyName.

Однако было бы еще лучше настроить вашу модель следующим образом:

Company<-->>Team<-->>Employee<<-->Role

Теперь у вас есть объект Role, который может назначать одну и ту же роль многим сотрудникам.Теперь вы можете получить сущность Role с помощью простого ключевого пути roleType== developer, и вы получите один объект обратно.Пройдя по employees отношению Role, вы получите всех сотрудников разработчиков.

Важная вещь, которую следует помнить с Core Data, заключается в том, что сущности и их отношения предназначены для имитации реальных объектов, событий и условий, с которыми имеет дело ваше приложение.Вы должны настроить модель данных так, чтобы как можно точнее представить эти реальные вещи и отношения между ними.Например, в реальном мире developer - это всего лишь одна роль, поэтому она должна быть представлена ​​только одним объектом в графе объектов.В реальном мире многие сотрудники могут выполнять роль разработчика, поэтому отношения между Employees и Roles должны быть Employee<<-->Role.

Чем ближе ваша модель имитирует реальность, тем легче становится ваше приложение.пиши во всех отношениях.

1 голос
/ 17 августа 2011

Я не уверен, что понял ваш вопрос, но если вы хотите использовать NSFetchedResultsController с UITableView, вы должны использовать NSFetchRequest, вы не можете просто следовать за отношением, которое использует сбой.

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

Однако вы можете получить NSFetchedPropertyDescription, посмотрев описание сущности и ее свойства:

NSEntityDescription *entityDescription = .....

Затем вы можете вызывать свойства и циклически обрабатывать весь массив, пока не найдете свое свойство:

NSArray *allProperties = entityDescription.properties;
NSFetchedPropertiesDescription *myPropertyDescription;
for(NSPropertyDescription *propertyDescription in allProperties) {
  // find it by name or class
  if([propertyDescription isKindOfClass:[NSFetchedPropertyDescription class]])
    myPropertyDescription = (NSFetchedPropertyDescription*)propertyDescription;
}

NSFetchedRequest *fetchRequest = [myPropertyDescription fetchRequest];

        NSFetchedResultsController *myController = [[NSFetchedResultsController alloc]
                                                 initWithFetchRequest:fetchRequest
                                                 managedObjectContext:myManagedObjectContext
                                                 sectionNameKeyPath:nil
                                                 cacheName:myCacheName];

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

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