我有一个包含三个实体的核心数据模型:Notification
,Group
和Customer
。这些是他们之间的关系:
我想在按客户分组的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 :(得分:2)
是的,你可以这样做。只需使用FRC获取客户,并将sectionNameKeyPath
设置为nil
。
<强>节强>
返回结果的数量是您的部分数量。使用客户数据填充节标题。
<强>行强>
部分中的行数为customer.notifications.count
。要填充该行,请确保notifications
以某种方式排序(例如按日期排序)并相应地显示它们:
NSArray *orderedNotifications =
[customerForSection.notifications sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]]];
Notification *notificationToBeDisplayed =
[orderedNotifications objectAtIndex:indexPath.row];
替代方案 - 建议 - 解决方案是更改数据模型。您可以直接将通知与所有客户相关联。这将具有额外的优势,即使组成员身份发生变化,通知仍然与正确的客户相关联。