1

我有一个包含三个实体的核心数据模型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值中的多个关系?这种场景下应该如何处理多对多关系呢?

4

1 回答 1

2

是的,你可以这样做。只需使用 FRC 获取客户并将其设置sectionNameKeyPathnil.


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


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

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

另一种推荐的解决方案是更改数据模型。您可以直接将通知与所有客户相关联。这将具有额外的优势,即使组成员资格发生变化,通知仍与正确的客户相关联。

于 2013-01-31T14:48:35.200 回答