Извлечение и сортировка по сущностям в Базовых данных - PullRequest
0 голосов
/ 02 июля 2010

Допустим, у меня есть модель, похожая на приведенную ниже, и мне нужно выбрать все «Персоны» определенного Company.companyName, отсортированного по personRole.roleWeight

Это модель, которая у меня есть на данный момент:

  • Субъект: Компания
  • Атрибуты: companyName
  • Отношения: companyRole

  • Субъект: Роль

  • Атрибуты: roleName, roleWeight
  • Отношения: rolePerson, RoleCompany

  • Сущность: Person

  • Атрибуты: personName
  • Отношения: роль человека

Вот простая схема отношений:

Компания - -

Есть ли способ сделать это?Если мне нужно изменить модель, я был бы счастлив сделать это.Все предложения приветствуются.

Спасибо,

Ответы [ 2 ]

1 голос
/ 02 июля 2010

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

Вы также не можете прийти к ней из роли (в отличие от человека), потому что выиметь много ко многим между ролью и человеком.

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

Обновление

Предполагаяизменил дизайн на:

Company --< Role >-- Person

Тогда решение становится намного проще:

- (NSArray*)peopleSortedByWeightInCompany:(NSString*)company inManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:[NSEntityDescription entityForName:@"Role" inManagedObjectContext:moc]];
  [request setPredicate:[NSPredicate predicateWithFormat:@"company.name == %@", companyName]];

  NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"weight" ascending:YES];
  [request setSortDescriptors:[NSArray arrayWithObject:sort]];

  NSError *error = nil;
  NSArray *roles = [moc executeFetchRequest:request error:&error];
  [request release], request = nil;
  NSAssert2(roles != nil && error == nil, @"Error fetching roles: %@\n%@", [error localizedDescription], [error userInfo]);

  NSArray *people = [roles valueForKeyPath:@"@distinctUnionOfObjects.person"];

  return people;
}

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

0 голосов
/ 21 июля 2010

Есть ли причина, по которой Роль - обезьяна в середине, а не человек?Это облегчило бы эту задачу, но, возможно, у вас есть другие вещи, которые вы делаете с данными, которые исключают эту опцию.Если у каждого человека была одна роль и одна компания, то вы могли бы создать дескриптор сортировки для role.roleWeight и использовать метод NSSet sortedArrayUsingDescriptors: для набора отношений сотрудников с компанией.Это даст вам новый отсортированный массив со списком всех сущностей Person, прикрепленных к данной компании, отсортированный по roleWeight (вы можете захотеть включить дополнительный дескриптор сортировки для обеспечения соответствия roleWeights).

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