1

私はコアデータに不慣れで、まだ頭を悩ませようとしています。解決しようと何時間も費やした問題があります。私はそれを解決できないようで、誰かが私を助けてくれることを望んでいました.

まだ画像を投稿できないので、ここに私のデータ モデルへのリンクを示します。

http://yourpcsolution.net/model.png

それぞれの関係には逆があります。ゲームは多くの期間を持つことができ、期間は多くのプレーヤーを持つことができます。プレーヤーは複数の期間に参加できます。

DBにデータを入力するための私のコードは次のとおりです。

- (void) prepareDB {
Games *game = [NSEntityDescription insertNewObjectForEntityForName:@"Games" inManagedObjectContext:self.managedObjectContext];
game.date = [NSDate date];
game.name = @"Game 1";

Periods *period = [NSEntityDescription insertNewObjectForEntityForName:@"Periods" inManagedObjectContext:self.managedObjectContext];

period.date = [NSDate date];
period.name = @"1st Period";

NSMutableSet *gameSet = [[NSMutableSet alloc] initWithObjects:period, nil];

game.periods = gameSet;

Players *player = [NSEntityDescription insertNewObjectForEntityForName:@"Players" inManagedObjectContext:self.managedObjectContext];

player.name = @"Player1";

NSMutableSet *playerSet = [[NSMutableSet alloc] initWithObjects:player, nil];

period.players = playerSet;

NSError *error;
if (![self.managedObjectContext save:&error]) {
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}

SQL dbを見るとデータがそこにあるので、それがデータを追加する正しい方法だと思います。私の問題は、各期間に属するプレーヤーを取得しようとすることです。Periods は Games のセットであり、Players は Core Data の Periods のセットであるためです。したがって、次のようにプレーヤーを取得することはできません: game.periods.players

期間を取得するためのコードを次に示します。xcode ログでエラーが発生しています。

"Relationship 'players' fault on managed object (0x8e72bc0) <Periods: 0x8e72bc0>
(entity: Periods; id: 0x8e727c0 <x-coredata://7F63902B-FCB6-4ACA-BB40-904755D37A4A/Periods/p1>;
data: {\n    date = \"2013-07-09 19:35:48 +0000\";\n
games = \"0x8e6d760 <x-coredata://7F63902B-FCB6-4ACA-BB40-904755D37A4A/Games/p1>\";\n
name = \"1st Period\";\n    players = \"<relationship fault: 0x9840330 'players'>\";\n})"

期間を取得するための私のコード:

NSString *firstPeriod = @"1st Period";
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", firstPeriod];
[request setEntity:[NSEntityDescription entityForName:@"Periods" inManagedObjectContext:self.managedObjectContext]];
[request setPredicate:predicate];

NSArray *period = [self.managedObjectContext executeFetchRequest:request error:&error];

ここからプレイヤーを取得する方法がわかりません。各ゲームに属するピリオドを取得する方法は知っていますが、ピリオドに属するプレーヤーを取得する方法はわかりません。私はこれを理解しようと何日も試みてきましたが、うまくいきません。

私のデータモデルは正しいですか? どのようにデータを取得すればよいですか? ヘルプやアドバイスをいただければ幸いです。

4

1 に答える 1

1

特定の期間のすべてのプレーヤーを取得するには、次のようにします。

NSString *firstPeriod = @"1st Period";

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Players" inManagedObjectContext:self.managedObjectContext]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY periodsin.name == %@", firstPeriod];
[request setPredicate:predicate];

NSArray *players = [self.managedObjectContext executeFetchRequest:request error:&error];

各プレイヤーは複数のピリオドに接続されているため、述語の「ANY」が必要です。

注意:対多関係のデータ型は であり、 ではNSSetありませんNSMutableSet

追加:特定のプレーヤーのすべての期間をフェッチするには、次のフェッチ リクエストを使用できます。

Players *givenPlayer = ... ; // the given player
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Periods" inManagedObjectContext:self.managedObjectContext]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY players == %@", givenPlayer];
[request setPredicate:predicate];
NSArray *periods = [self.managedObjectContext executeFetchRequest:request error:&error];

または、リレーションシップに直接アクセスできます。

Players *givenPlayer = ... ; // the given player
NSArray *periods = [givenPlayer.periodsin allObjects]; // "allObjects" converts NSSet to NSArray
于 2013-07-09T20:40:41.717 に答える