【问题标题】:iOS core data group byiOS 核心数据分组方式
【发布时间】:2015-07-29 19:08:27
【问题描述】:

在核心数据中,我有两个实体。 XMPPUserCoreDataStorageObject 和 XMPPGroupCoreDataStorageObject。

XMPPUserCoreDataStorageObject 有一个属性,它包含一个 XMPPGroupCoreDataStorageObject 数组(@property (nonatomic, strong) NSSet * groups;)

XMPPGroupCoreDataStorageObject 也有一个属性,它包含一个 XMPPUserCoreDataStorageObject 数组(@property (nonatomic, strong) NSSet* users;)

我想查询由 XMPPGroupCoreDataStorageObject 分组的 XMPPUserCoreDataStorageObject。这是多对多映射。

我怎样才能做到这一点?

【问题讨论】:

    标签: ios core-data group-by xmppframework


    【解决方案1】:

    您不能按多对多关系进行分组,因为子实体(在您的情况下为User)会出现多次。

    相反,按您想要分组的内容(在您的情况下为Group)获取。用于显示这些,例如一个表视图,使用提取的组填充表视图部分标题,并在表视图行中显示关联的Users。

    【讨论】:

      【解决方案2】:

      如果您能够修改数据模型,另一种解决方案是实现一个中间实体来建模多对多关系。所以而不是:

      User <<<--->>> Group
      

      你会的

      User <--->>> GroupMember <<<---> Group
      

      然后,您可以基于 GroupMember 实体进行提取。由于这与UserGroup 具有一对一的关系,因此您可以使用NSFetchedResultsController 进行分组,将sectionNameKeyPath 设置为“group.groupName”(或任何属性),然后填充基于user 关系属性的表视图(例如user.userName)。但缺点是创建和删除关系涉及插入/删除GroupMember 对象的更多工作。

      【讨论】:

      • 我同意它使 NSFetchedResultsController 以标准方式更有用。但是,如果“连接表”不包含其他数据,通常最好使用标准的多对多关系。
      • @Mundi 同意。但我认为对于那些 NSFetchedResultsController 很重要的人来说,包含这个选项是值得的。
      • 感谢您指出这个替代方案。当然,标准的多对多关系对于 NSFetchedResultsController 来说是完全可以的。
      • @Mundi 但是 cellForRowAtIndexPath: 方法在这种情况下如何工作?您将检索组,然后必须为该组中的用户进行提取,以使它们正确排序。这不是很低效吗?
      • @cfisher cellForRowAtIndexPath 与平常非常相似:按group.groupNameuser.userName(或其他)对FRC 进行排序。然后使用GroupMember *member = [self.fetchedResultsController objectAtIndexPath:indexPath]; 之类的东西,然后User *user = member.user 将为您提供对该行的用户引用,因此您可以使用任何用户属性来配置单元格。我应该提到另一个缺点:对于用户对象或组对象的更改不会触发 FRC 委托方法(FRC 仅观察获取的对象:即 GroupMembers。)
      猜你喜欢
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      相关资源
      最近更新 更多