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

时间:2010-11-27 16:25:06

标签: iphone objective-c core-data

我是iPhone上的核心数据的新手,并且对于许多关系有一些问题。

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

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

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

  3. 提前致谢。

2 个答案:

答案 0 :(得分:3)

  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

  2. 核心数据使用称为错误的智能机制:Faulting and Uniquing

答案 1 :(得分:2)

  

当然,我可以从中创建一个数组   设置并在内存中排序,但是   如果是的话会不会更有效率   SQLite数据库会进行排序吗?

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

你可以使用fetch作为Kentzo的建议来处理这个问题,但是,如果你已经拥有Movie对象,那么你已经拥有了所需的Comment个对象,这样你就可以使用NSSet的{{1为你创建排序数组。

sortedArrayUsingDescriptors:

在正常的Master-Detail视图设置中,您将在Master视图中选择一个MovieMO *aMovie=//...get the Movie object NSSortDescriptor *aSort=[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO] NSArray *sortedComments=[aMovie.comments sortedArrayUsingDescriptors:aSort]; 对象,然后将该对象传递给Detail视图控制器。然后,详细信息视图控制器将遍历Movie关系以获取将随后排序以显示的注释。

此方法适用于大多数应用。如果每部电影有数千条评论,则可能需要使用获取和/或获取结果控制器。