Core data 核心数据从具有多对多关系的集合中检索数据

Core data 核心数据从具有多对多关系的集合中检索数据,core-data,many-to-many,nsfetchrequest,nsset,Core Data,Many To Many,Nsfetchrequest,Nsset,我对核心数据还不熟悉,但我仍在努力了解它。我有一个问题,我花了几个小时试图解决。我似乎无法解决这个问题,希望有人能帮助我 我还不能发布图片,所以这里有一个指向我的数据模型的链接: 每个关系都有一个相反的关系。一场游戏可以有很多时段,一个时段可以有很多玩家。一个玩家可以在一个以上的时期 下面是我填充DB的代码: - (void) prepareDB { Games *game = [NSEntityDescription insertNewObjectForEntityForName:@"Gam

我对核心数据还不熟悉,但我仍在努力了解它。我有一个问题,我花了几个小时试图解决。我似乎无法解决这个问题,希望有人能帮助我

我还不能发布图片,所以这里有一个指向我的数据模型的链接:

每个关系都有一个相反的关系。一场游戏可以有很多时段,一个时段可以有很多玩家。一个玩家可以在一个以上的时期

下面是我填充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时,数据就在那里。我的问题是试图找回属于每个时期的球员。因为时段是游戏中的一组,而玩家是核心数据中的一组时段。所以我不能通过: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];
[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

要获取给定时间段内的所有玩家,以下操作应有效:

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

我使用了一个NSMutableSet,这样我就可以向其中添加玩家,然后我将其分配给game.periods集合。你知道为什么我在尝试检索某个时段时会收到错误消息吗?有没有一种简单的方法可以返回某个特定玩家所属时段的数组。例如,如果Player1处于3个不同的时段,我将如何为此写入获取请求?1)“错误”只是一个占位符对象(而不是错误)。当您访问属性时,会自动获取这些属性。故障记录在核心数据编程指南中。-2) 见更新的答案希望有帮助!我使用了一个NSMutableSet,这样我就可以向其中添加玩家,然后我将其分配给game.periods集合。你知道为什么我在尝试检索某个时段时会收到错误消息吗?有没有一种简单的方法可以返回某个特定玩家所属时段的数组。例如,如果Player1处于3个不同的时段,我将如何为此写入获取请求?1)“错误”只是一个占位符对象(而不是错误)。当您访问属性时,会自动获取这些属性。故障记录在核心数据编程指南中。-2) 见更新的答案希望有帮助!