我无法理解如何最好地使用 Core Data 来解决这个问题,包括描述问题的正确术语。下面是问题的说明性示例(但不是我的实际对象)。假设您有一个音乐播放系统,其中艺术家有歌曲,并且每次在系统中播放歌曲时,都会记录时间戳。
问题:如何找到播放歌曲的艺术家数量?
这里是样本NSManagedObject
@interface MYArtist : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSSet *songs;
@end
@interface MYSong : NSManagedObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) MYArtist *artist;
@property (nonatomic, retain) NSSet *plays;
@end
@interface MYPlay : NSManagedObject
@property (nonatomic, retain) NSDate *playDate;
@property (nonatomic, retain) MYSong *song;
@end
以下是艺术家、歌曲和播放的示例数据,包括播放日期:
A1 <-+-> S1_A1 <---> P1_S1_A1 (2012-08-31)
'-> S2_A1 <-+-> P1_S2_A1 (2012-08-31)
'-> P2_S2_A1 (2012-09-01)
A2 <-+-> S1_A2
'-> S2_A2 <---> P1_S2_A2 (2012-08-31)
A3 <---> S1_A3
使用下面的代码,我可以获取所有MYPlay
对象并构建一组艺术家,然后在最后找到集合的大小。此示例数据和代码的结果集将是计数 = 2 的 [A1, A2]。但是,我希望某些NSPredicate
语法或使用countForFetchRequest
更有效,而不是迭代对象并将它们错误地放入内存中。
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MYPlay"];
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSMutableSet *set = [[NSMutableSet alloc] init];
for (id result in results) {
MYPlay *play = (MYPlay *)result;
[set addObject:play.song.artist];
}
NSUInteger count = set.count;