繁体   English   中英

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

[英]Core Data to-many relationship in code

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

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

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

这是我到目前为止关于问题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);
}

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

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

在此输入图像描述

问题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);

        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM