跨核心数据中的实体获取和排序

时间:2010-07-01 21:24:23

标签: iphone core-data many-to-many

假设我有一个类似下面的模型,我需要获取按personRole.roleWeight排序的特定Company.companyName的所有'Person'

这是我目前的模特:

  • 实体:公司
  • 属性:companyName
  • 关系:companyRole

  • 实体:角色

  • 属性:roleName,roleWeight
  • 关系:rolePerson,RoleCompany

  • 实体:人

  • 属性:personName
  • 关系:人的角色

以下是关系的简单图表:

公司 - <角色> - <人

有办法做到这一点吗? 如果我需要修改模型,我很乐意这样做。欢迎提出所有建议。

谢谢,

2 个答案:

答案 0 :(得分:1)

您无法按角色权重排序,因为可能有多个适合的角色。

你也不能从角色(而不是角色)来到它,因为角色和人之间有多对多的角色。

你应该重新思考你的设计,因为拥有那么多对多没有多大意义。一点点数据去规范化,将多对多更改为一对多并重复角色名和角色权值将解决问题。

更新

假设您将设计更改为:

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收集关系另一端的所有人物对象,这些对象将按顺序检索它们。

答案 1 :(得分:0)

是否有理由认为角色是中间的猴子而不是人?这将使这项任务变得更容易,但也许您正在使用其他方法来排除此选项。如果每个人都有一个角色和一个公司,那么您可以为role.roleWeight创建排序描述符,并在公司的员工关系集中使用NSSet的sortedArrayUsingDescriptors:方法。这将为您提供一个新的排序数组,其中列出了按角色排序的所有附加到给定公司的Person实体(您可能希望包含一个辅助排序描述符来处理匹配的roleWeights)。