如何管理 Core Data 中的一对多关系?

Posted

技术标签:

【中文标题】如何管理 Core Data 中的一对多关系?【英文标题】:How to manage a to-many relationship in Core Data? 【发布时间】:2010-11-27 16:25:05 【问题描述】:

我是 iPhone 上的 Core Data 新手,对多对多关系有一些疑问。

数据模型包含两个对象 Movie 和 Comment。电影包含评论的 NSSet。 我想在表格视图中显示所有电影。当用户点击一个单元格时,应用程序会导航到另一个表格视图,其中显示所有对应的 cmets。

    问题: 我希望 cmets 按日期排序,但 NSSet 是无序的。当然,我可以从集合中创建一个数组并在内存中对其进行排序,但是如果 SQLite 数据库进行排序不是更有效吗?

    问题: 在检索到 Movies 数组后,每个都有一个空的 NSSet,它在第一次访问时填充了数据。当显示 cmets 列表时会发生这种情况。 但是当用户回到电影列表时会发生什么?不再需要之前显示的电影的 cmets。 Core Data 是否将所有“按需”实体保留在内存中?

提前致谢。

【问题讨论】:

【参考方案1】:

    您可以使用 NSFetchRequest。

    
    NSFetchRequest *request = [NSFetchRequest new];
    [request setEntity:aCommentEntity];
    [request setSortDescriptors:sortDescriptors];
    [request setPredicate:[NSPredicate predicateWithFormat:@"movie = %@", aMovie]];
    NSArray *comments = [managedObjectContext executeFetchRequest:request error:&error];
    
    也看看NSFetchedResultsController

    Core Data 使用称为故障的智能机制:Faulting and Uniquing

【讨论】:

【参考方案2】:

当然,我可以从 集合并在内存中对其进行排序,但是 如果 SQLite 数据库会做排序吗?

不,因为这将要求持久存储为每个可能的排序保留排序信息。由于排序根据即时需求变化很大,因此最好在视图控制器或同等级别进行排序。

您可以按照 Kentzo 的建议使用 fetch 来处理此问题,但是,如果您已经拥有 Movie 对象,则您已经拥有所需的 Comment 对象,因此您可以使用 NSSet 的 sortedArrayUsingDescriptors: 来创建排序的给你一个数组。

MovieMO *aMovie=//...get the Movie object
NSSortDescriptor *aSort=[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]
NSArray *sortedComments=[aMovie.comments sortedArrayUsingDescriptors:aSort];

在正常的 Master-Detail 视图设置中,您将在 Master 视图中选择一个 Movie 对象,然后将该对象传递给 Detail 视图控制器。然后,详细视图控制器将遍历Movie.comments 关系以获取然后排序显示的 cmets。

此方法适用于大多数应用。如果每部电影有数千个 cmets,则可能需要使用 fetch 和/或 fetched results 控制器。

【讨论】:

以上是关于如何管理 Core Data 中的一对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 CORE DATA 中的一对多关系

在 Core Data 中有效地获取一对多关系中的最新记录

将 Core Data 中的一对多显示为一对一

如何在 Core Data 中设置一对多关系的排序?

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存

Core Data 获取请求与 NSFetchedResultsController 的一对多关系