1

我是核心数据的新手,并且仍在努力解决它。我有一个问题,我花了几个小时试图解决。我似乎无法解决它,并希望有人可以帮助我。

我还不能发布图片,所以这里是我的数据模型的链接:

http://yourpcsolution.net/model.png

每个关系都有一个逆。一个游戏可以有多个周期,一个周期可以有多个玩家。一名玩家可以在多个时段中。

这是我填充数据库的代码:

- (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 是核心数据中 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, not 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 回答