2013-01-31 131 views
1

我有一个包含三个实体的核心数据模型:Notification,GroupCustomer。这些是它们之间的关系:对于核心数据中的多对多关系,sectionNameKeyPath的值

  • 一位顾客属于很多群体,一个群体可以有很多顾客。
  • 通知被发送(属于)到一个组,并且一个组可以接收(有)很多通知。

我想显示所有通知按客户分组的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值中的几个关系?在这种情况下应该如何处理多对多的关系?

+0

“通知”可以属于多个“客户”。您是否想要在其所属的每个“客户”部分中显示通知? –

+0

@MartinR是的,在这个特定的应用程序中,可以在几个部分重复相同的通知。 – elitalon

+1

我不认为这是可能的与获取结果控制器,因为FRC无法返回具有重复元素的对象列表。 –

回答

2

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

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


第行的数目将是customer.notifications.count。为了填充行,确保notifications以某种方式进行排序(比如,按日期),并与像这样相应地显示它们:

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

一个选择 - 推荐 - 解决办法是改变数据模型。您可以直接将通知与所有客户相关联。这将带来额外的好处,即使组成员身份发生变化,通知仍然与正确的客户相关联。

+0

客户没有直接与通知关联,但有很多组,所以我不能执行'customer.notifications.count' – elitalon

+0

FRC在这里有用吗?FRC将跟踪对“客户”对象的更改,但不会跟踪关联的“通知”对象。 –

+0

@elitalon然后它应该是'customer.groups.notifications.count'。相同的概念。但请参阅我的编辑和其他解决方案。 – Mundi