在iPhone上的Core Data中设置一对多关系

时间:2010-06-25 10:44:02

标签: iphone core-data

我是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背景,所以要温柔!

1 个答案:

答案 0 :(得分:0)

根据您的描述,我认为您的一对多关系设置错误。假设您有两个名为League和Team的实体,并且您已正确设置关系,那么当您希望将团队与联盟关联时,您的联盟对象不能是NSMutableSet,如您的代码段所示:也必须是NSManagedObject。一个联盟对象,在关系的许多方面将有一个名为团队或类似的属性,它将是NSMutableSet。一个Team对象,在关系的一侧将有一个名为league或类似的属性,它是一个League对象。

然后,要设置您可以像使用键值编码那样进行关系,但出于性能原因,最好这样做

teamObject.id = yourId;
teamObject.teamName = @"your team name";
teamObject.league = yourLeagueObject;

Apple的建议要快得多。