iOS 核心数据分组依据
iOS core data group by
在核心数据中,我有两个实体。 XMPPUserCoreDataStorageObject & XMPPGroupCoreDataStorageObject。
XMPPUserCoreDataStorageObject 有一个 属性,其中包含一个 XMPPGroupCoreDataStorageObject (@属性 (nonatomic, strong) NSSet * groups;)
数组
XMPPGroupCoreDataStorageObject 也有一个 属性,其中包含一个 XMPPUserCoreDataStorageObject 数组 (@属性 (nonatomic, strong) NSSet* users;)
我想查询按XMPPGroupCoreDataStorageObject分组的XMPPUserCoreDataStorageObject。这是多对多映射。
我怎样才能做到这一点?
您不能按 many-to-many 关系分组,因为 child 实体(在您的情况下为 User
)会出现不止一次。
取而代之的是,按您要分组的内容进行获取(在您的情况下为Group
)。用于在例如中显示这些table 视图,使用获取的组填充 table 视图部分 headers,并在 table 视图行中显示关联的 User
。
如果您能够修改数据模型,另一种解决方案是实现一个中间实体来为多对多关系建模。所以而不是:
User <<<--->>> Group
你会
User <--->>> GroupMember <<<---> Group
然后您可以根据 GroupMember
实体进行提取。由于这与 User
和 Group
都有一对一的关系,您可以使用 NSFetchedResultsController
进行分组,将 sectionNameKeyPath
设置为 "group.groupName"(或任何属性),然后根据 user
关系的属性(例如 user.userName
)填充 table 视图。但缺点是创建和删除关系需要更多工作 inserting/deleting GroupMember
对象。
在核心数据中,我有两个实体。 XMPPUserCoreDataStorageObject & XMPPGroupCoreDataStorageObject。
XMPPUserCoreDataStorageObject 有一个 属性,其中包含一个 XMPPGroupCoreDataStorageObject (@属性 (nonatomic, strong) NSSet * groups;)
数组XMPPGroupCoreDataStorageObject 也有一个 属性,其中包含一个 XMPPUserCoreDataStorageObject 数组 (@属性 (nonatomic, strong) NSSet* users;)
我想查询按XMPPGroupCoreDataStorageObject分组的XMPPUserCoreDataStorageObject。这是多对多映射。
我怎样才能做到这一点?
您不能按 many-to-many 关系分组,因为 child 实体(在您的情况下为 User
)会出现不止一次。
取而代之的是,按您要分组的内容进行获取(在您的情况下为Group
)。用于在例如中显示这些table 视图,使用获取的组填充 table 视图部分 headers,并在 table 视图行中显示关联的 User
。
如果您能够修改数据模型,另一种解决方案是实现一个中间实体来为多对多关系建模。所以而不是:
User <<<--->>> Group
你会
User <--->>> GroupMember <<<---> Group
然后您可以根据 GroupMember
实体进行提取。由于这与 User
和 Group
都有一对一的关系,您可以使用 NSFetchedResultsController
进行分组,将 sectionNameKeyPath
设置为 "group.groupName"(或任何属性),然后根据 user
关系的属性(例如 user.userName
)填充 table 视图。但缺点是创建和删除关系需要更多工作 inserting/deleting GroupMember
对象。