私は CoreData が初めてで、将来のプロジェクトのために少し遊んでいます。
歌手別にグループ化された曲のリストを表示しようとしています。歌は多くの歌手によって歌うことができ、歌手は多くの歌を歌うことができます:-) それが私のモデルです:
それから私は多対多の関係を持っています。
sectionNameKeyPath を songSingers.name に設定しようとすると、次のエラーでクラッシュします。
'NSInvalidArgumentException', reason: 'Invalid to many relationship in setPropertiesToFetch: (songSingers.name)'
このエラーが表示されるのはなぜですか? ここにいくつかのコードがあります:
- (void)viewDidLoad
{
[super viewDidLoad];
[self addDummyData];
NSError *anyError = nil;
BOOL success = [self.fetchedResultsController performFetch:&anyError];
if( !success ) NSLog(@"Error = %@", anyError);
}
- (void)addDummyData
{
[self deleteAllObjects:@"Song"];
[self deleteAllObjects:@"Singer"];
[self deleteAllObjects:@"Lyric"];
// Lyrics
Lyric *l = [NSEntityDescription insertNewObjectForEntityForName:@"Lyric" inManagedObjectContext:managedObjectContext];
l.name = @"Lyric 1";
// Songs
Song *s = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:managedObjectContext];
s.name = @"Song 1";
Song *s2 = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:managedObjectContext];
s2.name = @"Song 2";
Song *s3 = [NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:managedObjectContext];
s3.name = @"Song 3";
// Singers
Singer *sg = [NSEntityDescription insertNewObjectForEntityForName:@"Singer" inManagedObjectContext:managedObjectContext];
sg.name = @"Singer 1";
Singer *sg2 = [NSEntityDescription insertNewObjectForEntityForName:@"Singer" inManagedObjectContext:managedObjectContext];
sg2.name = @"Singer 2";
// Relations
sg.singerSongs = [NSSet setWithObjects:s, s2, nil];
sg2.singerSongs = [NSSet setWithObjects:s2, s3, nil];
s.songSingers = [NSSet setWithObjects:sg, nil];
s2.songSingers = [NSSet setWithObjects:sg, sg2, nil];
s3.songSingers = [NSSet setWithObjects:sg2, nil];
s.songLyric = l;
s2.songLyric = l;
NSError *anyError = nil;
BOOL success = [managedObjectContext save:&anyError];
if(!success)
{
NSLog(@"Error: %@", anyError);
}
}
- (NSFetchedResultsController *)fetchedResultsController {
if (!fetchedResultsController)
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Song"
inManagedObjectContext:managedObjectContext]];
NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSSortDescriptor *singerDescriptor = [[NSSortDescriptor alloc] initWithKey:@"songSingers.name"
ascending:YES];
ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObjects:nameDescriptor,nil]];
NSString *sectionNameKeyPath = @"songSingers.name";
NSFetchedResultsController *myFetchedResultsController
= [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:managedObjectContext
sectionNameKeyPath:sectionNameKeyPath
cacheName:nil];
myFetchedResultsController.delegate = self;
self.fetchedResultsController = myFetchedResultsController;
}
return fetchedResultsController;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Singer"
inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSError *anyError = nil;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest
error:&anyError];
Singer *sg = [fetchedObjects objectAtIndex:section];
return sg.name;
}
私のダミーデータ「addDummyData」を見ることができます。私はよく定義されていると思います:^P
- 歌 1 と 2 は歌手 1 のためのものです
- 2曲目もシンガー2用
- 歌 3 は歌手 2 のためのものです
ありがとうございました