問題を説明するための正しい用語を含め、この問題を解決するためにCoreDataを最適に使用する方法を理解するのに苦労しています。以下は、問題の実例となるサンプルです(ただし、実際のオブジェクトではありません)。アーティストが曲を持っている音楽再生システムがあり、システムで曲が再生されるたびにタイムスタンプが記録されるとします。
質問:曲を再生したアーティストの数を確認するにはどうすればよいですか?
こちらがサンプルです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
アーティストのセットを作成して、最後にセットのサイズを見つけることができます。このサンプルデータとコードから得られるセットは、count = 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;