NSFetchedResultsController复合获取请求和模型

时间:2016-05-26 11:05:52

标签: ios objective-c core-data nsfetchedresultscontroller

我正在尝试为这种情况设计我的CoreData模型:

我们有Song个对象与某些List有很多关系。

每个List都有name属性,并且与Song有很多关系

需要这些多对多关系,因为可以在每个Song同时显示一个List

我需要以某种方式获取使用Song按这些标题(List的名称)分组的NSFetchedResultsController列表(因为用户可能有10,000首歌曲而且我不想要把它存放在NSArray)的某个地方。

当我尝试将sectionNameKeyPath:设置为某个值时,例如@"List.name"我发现错误"不允许多人关系"当然这是有道理的。

所以我需要帮助如何设计我的模型,以便SongList像#34;历史" /"下一场比赛"等,并能够使用NSFetchedResultsController获取所有数据。

任何帮助表示赞赏。如果我的解释不清楚,请询问其他信息。

我的部分代码:

- (void)initFetch {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Song"];

    [fetchRequest setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ANY list.@count != 0"];
    fetchRequest.fetchBatchSize = 20;

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.context sectionNameKeyPath:@"name" cacheName:nil];
    [self.fetchedResultsController setDelegate:self];

    NSError *error = nil;
    [self.fetchedResultsController performFetch:&error];

    if (error) {
        NSLog(@"Unable to perform fetch.");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }
}

2 个答案:

答案 0 :(得分:1)

使用FRC非常适合向用户显示数据,但使用它可以决定您的模型需要如何构建,而不是您可能会感觉您的模型实体和关系应该如何构建。在您的情况下,您似乎希望查看数据库中歌曲的实际States列表,而不是歌曲列表。每个州的实例都与歌曲有一对一的关系,州可以在你的列表中有一对多的关系,例如。链接到历史列表,播放下一个列表,当前正在播放“列表”(在最后一种情况下只有一个实例)。通过将FRC实体设置为此State实体,并且链接到状态所在列表的部分键路径可以实现上述要求,而无需操作indexPath或使用多个FRC。此外,还有这个单独的实体允许您稍后添加其他属性,例如上次播放的日期或者播放次数的汇总。所有这些都可以在状态实体上完成,而不是在Song实体本身上完成。

答案 1 :(得分:0)

您不需要使用FRC来防止过多的数据加载,这不是那样做的事情。 FRC的力量是观察检测变化的背景。当你试图在人际关系中进行导航时,这种力量也不能很好地发挥作用,因此在这种情况下,你可能也不会因使用FRC而获益。

当您不再需要管理对象时(在某些情况下手动但系统会在需要时自行执行此操作)并批量处理获取请求时,对数据使用的限制是对故障管理对象进行限制。在获取请求上设置批量大小时,返回的NSArray将仅处理将数据页面一次加载到内存中。 FRC受益于此,但无法控制它 - 如果您忘记添加批次,FRC不会为您做到这一点!

因此,您可以设置一个系统,其中您有多个阵列,每个部分1个,并自行管理所有内容。或者您可以使用多个FRC,每个部分1个,并操纵索引路径,以便所有内容挂起。

或者,您可以通过添加代表SongList成员资格的中间对象来更改您的数据模型,因为这样会破坏多对多关系,并留下一个前置和排序描述符中的可导航关系。在这种情况下,新实体将是您为FRC获取的实体。请注意上面提到的关于跨越关系的更改跟踪的问题,请注意您更改的内容以及如何...