我有三个实体:会话,用户和测试。会话具有0个用户,用户可以执行0-6个测试。 (我说0但是在实际应用程序中总是至少需要1个,一个会话至少有1个用户,并且至少有一个用户测试。但是我说0表示一个空的开始。)所有实体都有自己的特定数据属性也是。用户具有名称,会话具有名称,测试具有要由用户填写的六个值,等等。但我的问题在于关系。
如何设置多个用户并将其添加到一个会话中(一个用户的多个测试也是如此)。
如何以正确的方式显示内容?如何显示具有多个用户且这些用户已完成多个测试的会话?
到目前为止,这是关于问题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);
}
答案 0 :(得分:2)
我发现它很有用(而且似乎是我在SO看到的代码示例中的常见做法),将复数形式用于多对多关系,例如: users
表示从会话到用户的多对多关系。它强调了这样一个事实,即关系的价值是集而不是单一的对象,并且可能会让事情变得更加清晰。
所以你的模型看起来像这样:
问题1:如果您创建了Session *session
和User *user
,那么
user.session = session;
将用户添加到会话中。调用
[session addUsersObject:user];
具有相同的效果。但是,如果关系被正确定义为反向关系,则只需要其中一个调用,它会自动暗示另一个调用。
问题2:对于Session *session
,session.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);
}
}
}