首页 文章

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

提问于
浏览
1

我是iPhone上的Core Data新手,对于多人关系有一些问题 .

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

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

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

提前致谢 .

2 回答

  • 3

    当然,我可以从集合中创建一个数组并在内存中对其进行排序,但如果SQLite数据库进行排序,它会不会更有效率?

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

    您可以使用fetch来处理这个作为Kentzo的建议,但是,如果您已经拥有 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 关系以获取将随后排序以显示的注释 .

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

  • 2
    • 您可以使用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

相关问题