我正在尝试为这种情况设计我的CoreData模型:
我们有Song
个对象与某些List
有很多关系。
每个List
都有name
属性,并且与Song
有很多关系
需要这些多对多关系,因为可以在每个Song
同时显示一个List
。
我需要以某种方式获取使用Song
按这些标题(List
的名称)分组的NSFetchedResultsController
列表(因为用户可能有10,000首歌曲而且我不想要把它存放在NSArray
)的某个地方。
当我尝试将sectionNameKeyPath:
设置为某个值时,例如@"List.name"
我发现错误"不允许多人关系"当然这是有道理的。
所以我需要帮助如何设计我的模型,以便Song
和List
像#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);
}
}
答案 0 :(得分:1)
使用FRC非常适合向用户显示数据,但使用它可以决定您的模型需要如何构建,而不是您可能会感觉您的模型实体和关系应该如何构建。在您的情况下,您似乎希望查看数据库中歌曲的实际States
列表,而不是歌曲列表。每个州的实例都与歌曲有一对一的关系,州可以在你的列表中有一对多的关系,例如。链接到历史列表,播放下一个列表,当前正在播放“列表”(在最后一种情况下只有一个实例)。通过将FRC实体设置为此State
实体,并且链接到状态所在列表的部分键路径可以实现上述要求,而无需操作indexPath或使用多个FRC。此外,还有这个单独的实体允许您稍后添加其他属性,例如上次播放的日期或者播放次数的汇总。所有这些都可以在状态实体上完成,而不是在Song实体本身上完成。
答案 1 :(得分:0)
您不需要使用FRC来防止过多的数据加载,这不是那样做的事情。 FRC的力量是观察检测变化的背景。当你试图在人际关系中进行导航时,这种力量也不能很好地发挥作用,因此在这种情况下,你可能也不会因使用FRC而获益。
当您不再需要管理对象时(在某些情况下手动但系统会在需要时自行执行此操作)并批量处理获取请求时,对数据使用的限制是对故障管理对象进行限制。在获取请求上设置批量大小时,返回的NSArray
将仅处理将数据页面一次加载到内存中。 FRC受益于此,但无法控制它 - 如果您忘记添加批次,FRC不会为您做到这一点!
因此,您可以设置一个系统,其中您有多个阵列,每个部分1个,并自行管理所有内容。或者您可以使用多个FRC,每个部分1个,并操纵索引路径,以便所有内容挂起。
或者,您可以通过添加代表Song
中List
成员资格的中间对象来更改您的数据模型,因为这样会破坏多对多关系,并留下一个前置和排序描述符中的可导航关系。在这种情况下,新实体将是您为FRC获取的实体。请注意上面提到的关于跨越关系的更改跟踪的问题,请注意您更改的内容以及如何...