2013-07-09 5 views
1

Je suis nouveau pour les données de base et je suis toujours en train d'essayer de comprendre. J'ai un problème que j'ai passé des heures à essayer de résoudre. Je n'arrive pas à le résoudre et espérais que quelqu'un puisse m'aider.données de base récupérant des données à partir de jeux avec plusieurs à plusieurs relations

Je ne peux pas poster des images pourtant si ici est un lien vers mon modèle de données:

http://yourpcsolution.net/model.png

Chaque relation a une inverse. Un jeu peut avoir plusieurs périodes et une période peut avoir plusieurs joueurs. Un joueur peut être dans plus d'une période.

Voici mon code pour peuplant 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]); 
} 
} 

Je pense que c'est la bonne façon d'ajouter des données parce que quand on regarde à la base de données SQL les données sont là. Mon problème est d'essayer de récupérer les joueurs qui appartiennent à chaque période. Parce que Périodes est un ensemble dans Jeux et Joueurs est un ensemble de Périodes dans les données de base. Je ne peux pas récupérer les joueurs en allant: game.periods.players

Voici mon code pour récupérer une période et dans le journal de Xcode je reçois une erreur:

"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})" 

Mon code pour récupérer un Période:

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]; 

Je ne sais pas comment procéder à partir d'ici pour récupérer les joueurs. Je sais comment récupérer quelles périodes appartiennent à chaque jeu mais je ne sais pas comment récupérer les joueurs qui appartiennent à une période. J'essaye depuis des jours de comprendre cela et ça ne marche pas.

Mon modèle de données est-il correct? Comment devrais-je récupérer les données? Toute aide ou conseil est apprécié.

Répondre

1

Pour récupérer tous les joueurs d'une période donnée, ce qui suit devrait fonctionner:

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 » dans le prédicat est nécessaire parce que chaque joueur est connecté à plusieurs périodes.

Remarque: Le type de données d'un à plusieurs est NSSet, pas NSMutableSet.

AJOUTÉE: Pour récupérer toutes les périodes pour un joueur donné, vous pouvez utiliser la requête d'extraction suivante:

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]; 

Vous pouvez également accéder à la relation directe:

Players *givenPlayer = ... ; // the given player 
NSArray *periods = [givenPlayer.periodsin allObjects]; // "allObjects" converts NSSet to NSArray 
+0

J'ai utilisé un NSMutableSet pour que je puisse y ajouter des joueurs alors j'assigne ceci à l'ensemble game.periods. Savez-vous pourquoi je reçois le message d'erreur en essayant de récupérer une période ?? – TazmanNZL

+0

Existe-t-il un moyen facile de retourner un tableau des périodes auxquelles un joueur appartient. Par exemple, si Player1 était dans 3 périodes différentes, comment est-ce que j'écrirais la demande d'extraction pour ceci? – TazmanNZL

+0

1) Un "défaut" est juste un objet réservé (et non une erreur). Les propriétés sont récupérées automatiquement lorsque vous y accédez. Les défauts sont documentés dans le Guide de programmation des données de base. - 2) Voir la mise à jour de la réponse. - J'espère que cela pourra aider! –

Questions connexes