【问题标题】:Value of sectionNameKeyPath for many-to-many relationship in Core DataCore Data 中多对多关系的 sectionNameKeyPath 值
【发布时间】:2013-02-20 17:39:26
【问题描述】:

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

【问题讨论】:

  • 一个“通知”可以属于多个“客户”。您想在它所属的每个“客户”部分中显示通知吗?
  • @MartinR 是的,在这个特定的应用程序中,可以在多个部分重复相同的通知。
  • 我认为使用 fetched results controller 是不可能的,因为 FRC 无法返回包含重复元素的对象列表。
  • @MartinR 我曾想过另辟蹊径:获取所有客户并获取他们的通知。在那种情况下,我不知道如果通知被修改,NSFetchedResultsControllerDelegate 方法是否会被执行。
  • 不,“客户”上的 FRC 不会收到相关“通知”对象更改的通知。

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


【解决方案1】:

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

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


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

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

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

【讨论】:

  • 一个客户不是直接和一个通知关联,而是和很多组关联,所以我不能执行customer.notifications.count
  • FRC 在这里有用吗? FRC 将跟踪对“客户”对象的更改,但不会跟踪关联的“通知”对象。
  • @elitalon 那么应该是customer.groups.notifications.count。相同的概念。但请参阅我的编辑和其他解决方案。
  • @MartinR 对对象图的任何更改都应由 FRC 记录并触发其委托方法。
  • @Mundi Per NSFetchedResultsController 文档它通知其代表控制器的获取结果已更改。对我来说,不清楚Notification 的变化是否会传播到所有相关的Group,然后传播到每个相关的Customer
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多