sectionNameKeyPath的值,用于Core Data中的多对多关系

时间:2013-01-31 13:38:33

标签: ios core-data many-to-many nsfetchedresultscontroller

我有一个包含三个实体的核心数据模型:NotificationGroupCustomer。这些是他们之间的关系:

  • 客户属于多个群组,群组可以拥有多个客户。
  • 向组发送(所属)通知,组可以接收(拥有)许多通知。

我想在按客户分组的UITableView中显示所有通知。我创建了一个NSFetchedResultsController,就像这样:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.fetchBatchSize = 10;
fetchRequest.predicate = nil;

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Notification"
                                          inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = entity;

// Default sort descriptors are built in a separate custom method
NSArray *sortDescriptors = [self getDefaultSortDescriptorsForEntity:entity];
fetchRequest.sortDescriptors = sortDescriptors;

return [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                           managedObjectContext:self.managedObjectContext
                    sectionNameKeyPath:@"group.customers.firstName"
                             cacheName:nil];

假设这是检索由客户分组的所有通知的有效方法(我也不确定)iOS正在抛出以下异常:

@"Failed to fetch all Notification objects"
@"Reason: Invalid to many relationship in setPropertiesToFetch: (group.customers.firstName) (NSInvalidArgumentException)"

我一次又一次地检查了这些关系,看看是否有什么东西丢失,一切似乎都是正确的。我可以为所有实体创建和删除对象,并且它们之间的链接也是正确的。

我的问题是:是否可以遍历sectionNameKeyPath值中的多个关系?如何在这种情况下处理多对多关系?

1 个答案:

答案 0 :(得分:2)

是的,你可以这样做。只需使用FRC获取客户,并将sectionNameKeyPath设置为nil

<强>节
返回结果的数量是您的部分数量。使用客户数据填充节标题。

<强>行
部分中的行数为customer.notifications.count。要填充该行,请确保notifications以某种方式排序(例如按日期排序)并相应地显示它们:

NSArray *orderedNotifications = 
  [customerForSection.notifications sortedArrayUsingDescriptors:
   @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]]];
Notification *notificationToBeDisplayed = 
   [orderedNotifications objectAtIndex:indexPath.row];

替代方案 - 建议 - 解决方案是更改数据模型。您可以直接将通知与所有客户相关联。这将具有额外的优势,即使组成员身份发生变化,通知仍然与正确的客户相关联。