核心数据一对多关系

时间:2014-07-09 23:19:57

标签: ios core-data

我一直在互联网上搜索几天寻找有关如何使用两个实体并为数据添加值并链接它们的教程。以下是我的应用设置:

我正在创建一个允许用户创建运动员的应用程序,并且在该运动员中他们可以添加多个体育赛事。我有两个实体:AthletesEvents,它们与AthletesEvents之间存在一对一的关系,反之亦然。

我遇到的问题是要在name个权限内添加opponentEvents属性值的代码,同时确保该特定名称和对手匹配最多只有一名运动员。我已经尝试使用Core Data Accessor方法,以及为权限和添加特定键的值创建新的NSManagedObjects。

我试图遵循CoreDataRecipes示例代码以及Web上的常见Core Data教程。任何人都可以通过一些基本的方法功能或其他帮助你的教程帮助引导我走上正确的道路吗?感谢。

1 个答案:

答案 0 :(得分:0)

您需要停止考虑RDBMS(关系数据库)并开始考虑托管对象模型。 CoreData处理管理对象及其关联。您可以将运动员对象与事件对象相关联(通过我建议使用单数与复数来表示实体名称,即运动员和事件与运动员和事件,并使用单数形式用于一对一关系,将复数用于多对多关系)。这是一个偏好的东西,但我称自己为运动员(对象)而不是运动员(对象)。使其更具可读性和直观性。

假设您的实体在描述关系时看起来像这样:

    @interface Athlete : NSManagedObject
    @property (nonatomic, retain) NSString * name;
    //... a bunch more attributes
    @property (nonatomic, retain) Event *event;  // use singluar for relationship name too
    //...
    @end

    @interface Event : NSManagedObject
    @property (nonatomic, retain) NSString * eventName;
    //... a bunch more attributes
    @property (nonatomic, retain) NSSet *athletes; // use plural for relationship name
    //...
    @end

    @implementation MyViewController
    //... some method
    // fetch the athletes (possibly present in table view or other mechanism for selection)
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Athlete"];
    NSArray *athletes = [managedObjectContext executeFetchRequest:fetchRequest error:nil];

    // select the althletes (primary & opponent - hardcoded for example)
    //... 
    NSArray *selectedAthletes = [NSArray arrayWithObjects: athletes[0], athletes[1], nil];

    // create an event
    Event *event = [NSEntityDescription
                        insertNewObjectForEntityForName:@"Event"
                        inManagedObjectContext:context];
    // add the athletes
    [event addAthletes:[NSSet setWithArray:selectedAthletes]];
    //...   
@end

现在你有2名运动员参加比赛。如果你想区分对手和挑战者那么你可以建立2对一的关系(从事件到运动员),比如对手和挑战者,并通过以下方式将事件与运动员联系起来:

@interface Event : NSManagedObject
@property (nonatomic, retain) NSString * eventName;
//... a bunch more attributes
@property (nonatomic, retain) Athlete *opponent; // use singluar for relationship name
@property (nonatomic, retain) Athlete *challenger; 
//...
@end

//...
event.opponent = athletes[0];
event.challenger = athletes[1];
//...