核心数据代码中的多对多关系

时间:2012-12-15 05:02:17

标签: objective-c ios core-data

我有三个实体:会话,用户和测试。会话具有0个用户,用户可以执行0-6个测试。 (我说0但是在实际应用程序中总是至少需要1个,一个会话至少有1个用户,并且至少有一个用户测试。但是我说0表示一个空的开始。)所有实体都有自己的特定数据属性也是。用户具有名称,会话具有名称,测试具有要由用户填写的六个值,等等。但我的问题在于关系。

  1. 如何设置多个用户并将其添加到一个会话中(一个用户的多个测试也是如此)。

  2. 如何以正确的方式显示内容?如何显示具有多个用户且这些用户已完成多个测试的会话?

  3. 到目前为止,这是关于问题1的代码:

    Session *session = [NSEntityDescription insertNewObjectForEntityForName:@"Session"
                                      inManagedObjectContext:context];
    session.name = @"Session 1";
    
    User *users = [NSEntityDescription insertNewObjectForEntityForName:@"User"
                                       inManagedObjectContext:context];
    users.age = [NSNumber numberWithInt:28];
    users.session = session;
    //session.user = users;
    [sessie addUserObject:users];
    

    关于问题2:我可以记录会话,但是我无法从会话中记录用户。

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session"
                                              inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    for (Session *info in fetchedObjects) {
     NSLog(@"Name of session: %@", info.name);
     NSLog(@"Having problems with this: %@",info.user);
     //User *details = info.user;
     //NSLog(@"User: %@", details.age);
    }
    

1 个答案:

答案 0 :(得分:2)

我发现它很有用(而且似乎是我在SO看到的代码示例中的常见做法),将复数形式用于多对多关系,例如: users表示从会话用户的多对多关系。它强调了这样一个事实,即关系的价值是而不是单一的对象,并且可能会让事情变得更加清晰。

所以你的模型看起来像这样:

enter image description here

问题1:如果您创建了Session *sessionUser *user,那么

user.session = session;

将用户添加到会话中。调用

[session addUsersObject:user];

具有相同的效果。但是,如果关系被正确定义为反向关系,则只需要其中一个调用,它会自动暗示另一个调用。

问题2:对于Session *sessionsession.users是与该会话相关的所有用户的集合。它是NSSet,您可以遍历该集合。同样,user.tests是用户的所有测试的集合。

因此,以下代码显示了包含其用户和测试的所有会话:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session"
                                          inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSArray *sessions = [context executeFetchRequest:fetchRequest error:&error];
for (Session *session in sessions) {
    NSLog(@"Name of session: %@", session.name);
    for (User *user in session.users) {
        NSLog(@"   User name %@, age %@", user.name, user.age);
        for (Test *test in user.tests) {
            NSLog(@"      Test: %@", test.name);

        }
    }
}