【问题标题】:Setting up a one to many relationship in Core Data on the iPhone在 iPhone 上的 Core Data 中设置一对多关系
【发布时间】:2010-06-25 10:44:02
【问题描述】:

我是 iPhone 开发的新手,试图弄清楚如何设置 Core Data 的一对多关系。我有两个实体设置一个联赛,它与一个实体团队具有一对多的关系。一个联盟里有这么多球队。想想所有打棒球并进入 MLB 的球队。

当用户第一次输入他们的用户名和密码时,我会预先填写数据,所以我首先填充了联赛,这没有问题。然后,当我开始添加球队时,我会搜索联赛。代码如下。

- (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;
    }
}

通过调用这个然后设置团队条目并保存('league' 是我的关系):

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

当我运行它时,我在控制台中收到此错误消息。

“实体 Teams 不符合键“联盟”的键值编码。”

我这样做对吗?就我所读的一切而言,我似乎是。我来自 MySQL 背景,所以要温柔!

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    根据您的描述,我认为您的一对多关系设置错误。假设您有两个名为 League 和 Team 的实体,并且您已经正确设置了关系,当您想要将团队与联赛关联时,您的联赛对象不能是 NSMutableSet,如代码 sn-p 所示:也必须是NSManagedObject。处于关系的多方的 League 对象将具有名为 teams 或类似名称的属性,该属性将是 NSMutableSet。一个 Team 对象,在关系的一侧将有一个名为 League 或类似的属性,它是一个 League 对象。

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

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

    Apple 建议这样做要快得多。

    【讨论】:

    • 感谢您的加入,我已经更改了一些内容,但仍然无法正常工作。如果我评论“teamObject.league = yourLeagueObject;”然后它确实写了所有东西,但没有建立关系。我得到的错误是“[Teams setLeague:]: unrecognized selector sent to instance”所以我的'Leagues'实体有一个teams属性,并且teams属性有To-Many检查。反之设置为​​联赛,这是 Teams 实体中的关系属性,没有选中 To-Many 复选框。对吗?
    • 我明白了。实际上最终成为我的 XMLParser 中的一个问题。追溯了一下,发现了。不过,你写的东西帮助很大。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多