我是iPhone开发的新手,试图弄清楚如何设置一对多的关系核心数据。我有两个实体设置一个联盟,与实体团队有一对多的关系。联盟中很多球队都是如此。想想所有参加棒球比赛并参加美国职棒大联盟的球队。
当用户首次输入他们的用户名和密码时,我正在预先填写数据,所以我首先填充了联赛,我没有问题。然后,当我开始添加团队时,我会搜索联盟。代码如下。
- (NSMutableSet *)checkItem:(int *)identifier inTable:(NSString *)table inContext:(NSString *)context {
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:table inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:context,identifier];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
if ([items count] >= 1) {
return [items objectAtIndex:0];
} else {
return nil;
}
}
通过调用此方法然后设置团队条目并保存('联盟'是我的关系):
NSMutableSet *leagueObjectSet = [self checkItem:lid inTable:@"Leagues" inContext:@"id=%i"];
NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Teams" inManagedObjectContext:managedObjectContext];
[teamObject setValue:[NSNumber numberWithInt:tid] forKey:@"id"];
[teamObject setValue:[dict valueForKey:@"name"] forKey:@"teamName"];
[teamObject setValue:leagueObjectSet forKey:@"league"];
[self saveAction];
当我运行此操作时,我在控制台中收到此错误消息。
“实体团队不符合关键”联盟“的关键值编码。”
我这样做了吗?我读过的所有东西看起来都像是我。我来自MySQL背景,所以要温柔!
答案 0 :(得分:0)
根据您的描述,我认为您的一对多关系设置错误。假设您有两个名为League和Team的实体,并且您已正确设置关系,那么当您希望将团队与联盟关联时,您的联盟对象不能是NSMutableSet
,如您的代码段所示:也必须是NSManagedObject
。一个联盟对象,在关系的许多方面将有一个名为团队或类似的属性,它将是NSMutableSet
。一个Team对象,在关系的一侧将有一个名为league或类似的属性,它是一个League对象。
然后,要设置您可以像使用键值编码那样进行关系,但出于性能原因,最好这样做
teamObject.id = yourId;
teamObject.teamName = @"your team name";
teamObject.league = yourLeagueObject;
Apple的建议要快得多。