如何使用 MagicalRecord 过滤和获取记录?

Posted

技术标签:

【中文标题】如何使用 MagicalRecord 过滤和获取记录?【英文标题】:How to filter & fetch records with MagicalRecord? 【发布时间】:2015-02-26 11:45:00 【问题描述】:

我有两个这样的课程,

@class Songs;

@interface Album : NSManagedObject

@property (nonatomic, retain) NSNumber * albumID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *songs;

@end

@interface Album (CoreDataGeneratedAccessors)
- (void)addSongsObject:(Songs *)value;
- (void)removeSongsObject:(Songs *)value;
- (void)addSongs:(NSSet *)values;
- (void)removeSongs:(NSSet *)values;
@end
@class Album;

@interface Songs : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * length;
@property (nonatomic, retain) Album *owner;

@end

假设,我创建了 10 张专辑,每张专辑都有一些随机(正)数量的歌曲。现在我想查找并获取歌曲数量最多的前 5 个专辑。

如何使用 MagicalRecords 做到这一点?

目前,我正在这样做,

NSLog(@"%@",[Album MR_findAllSortedBy:@"albumID" ascending:YES withPredicate:[NSPredicate predicateWithFormat:@"@max.@count.songs"]]);

//NSLog(@"%@",[Album MR_findAllSortedBy:@"albumID" ascending:YES]); //works fine

但它会崩溃并显示以下消息:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法解析格式 字符串“@max.@count.songs”'

我的谓词字符串无效吗?如果是,那么实现这一目标的正确方法是什么。

【问题讨论】:

这不是答案,所以我将其写为评论:我对神奇的记录库感到不舒服,我将它从应用程序中完全删除并自己做所有事情。我有点慢,但学习和跳跃比摔倒更好。 【参考方案1】:

根据this post,您不能在 fetch 上按计数排序。您需要获取所有项目,然后对它们进行排序和修剪:

 NSArray* array = [Album MR_findAll];
 array = [array sortedArrayUsingDescriptors:@[ [NSSortDescriptor sortDescriptorWithKey:@"songs.@count" ascending:NO] ] ];
 array = [array subarrayWithRange:NSMakeRange(0, MIN( array.count, 5) )];

【讨论】:

以上是关于如何使用 MagicalRecord 过滤和获取记录?的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 获取关系 id 为 x 的一对多关系中的所有实体

MagicalRecord findByAttribute 返回反向关系文档问题

如何在不阻塞 UI 的情况下正确使用 MagicalRecord 从 Web 服务导入数据

使用 MagicalRecord 在后台执行获取请求

获取 MagicalRecord NSManagedContext 以在后台线程中使用

CoreData(MagicalRecord) 获取保存的对象