如何将 sortDescriptor 用于一对多关系的属性
Posted
技术标签:
【中文标题】如何将 sortDescriptor 用于一对多关系的属性【英文标题】:How to use sortDescriptor for an attribute on a to many relationship 【发布时间】:2012-09-12 05:12:27 【问题描述】:-
我有一个歌曲实体和一个播放列表实体。
播放列表可以有多个歌曲,并且歌曲可以链接到多个播放列表。
我有一个 ListToSongs 实体,它维护将歌曲添加到播放列表的顺序。我没有在 ios5 中使用“有序关系”(我知道它的存在并且我需要对我的模型进行更多控制)并且我通过 PlayListToSong 实体中的“sortOrder”字段存储订单。所以模式被建模为(关系名称写在下面的括号中):
歌曲(播放列表)(歌曲)ListToSong(播放列表)>(歌曲)列表
我想使用获取请求获取给定播放列表的所有歌曲。
ListToSong 上的以下查询有效。这会获取所有 PlayListToSong obj,我可以使用 obj.song 来获取 Song 对象。还返回在 sortOrder 上排序的数据。效果很好。 (为简洁起见,下面的代码 sn-ps 是使用 MagicalRecord 编写的)。
songFilter = [NSPredicate predicateWithFormat:@"playlist == %@", filterList];
linkObjs = [FRListToSongs MR_findAllSortedBy:@"sortOrder" ascending:YES withPredicate:songFilter inContext:ctxt];
以下对 Song 实体的查询会导致崩溃。如果我删除排序描述符并仅获取,它可以工作。所以问题在于 sortDescriptor “playlists.sortOrder”,它试图根据 ListToSongs 实体中的属性进行排序。
songFilter = [NSPredicate predicateWithFormat:@"ANY playlists.playlist == %@", filterList];
songs = [FRSong MR_findAllSortedBy:@"playlists.sortOrder" ascending:YES withPredicate:songFilter inContext:ctxt];
在纯 SQL(如下所示)中,我试图在 Song 和 ListToSong 之间进行连接,并按“sortOrder”字段排序。
SELECT DISTINCT 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZSEQ FROM ZSONG t0 JOIN ZFRLISTTOSONGS t1 ON t0.Z_PK = t1.ZSONG WHERE t1.ZPLAYLIST = ? order by t1.ZSORTORDER
如何将上述 SQL 映射到 coredata 语法并给出正确的 sortDescriptor?
请注意,唯一的问题是如何在最后获得“order by t1.ZSORTORDER”,因为我无法正确指定 sortDescriptor。没有排序描述符,获取请求工作正常。
【问题讨论】:
使用 sortDescriptor 时的崩溃日志是什么? “这里不允许有很多键”。这是有道理的。 playlists 是一个集合,它没有名为 sortOrder 的属性,但是如何指定该 sortOrder 属性呢? 【参考方案1】:我终于在我的问题中继续使用上面提到的“方法 1”。我获取 ListToSong 实体并使用 obj.song 来获取相关的 Song 对象。我使用了 relationshipKeyPathsForPrefetching 来预取链接到 ListToSong 对象的歌曲对象。
【讨论】:
以上是关于如何将 sortDescriptor 用于一对多关系的属性的主要内容,如果未能解决你的问题,请参考以下文章
如何修改此方法调用以便使用 sortdescriptors 进行排序?
CoreData:将 MagicalRecord 与 FetchedResultsController 和自定义 sortDescriptor 一起使用