一对多关系核心数据

时间:2014-06-23 14:23:37

标签: ios core-data entity-relationship

在尝试单独执行该操作三天后,在阅读了大量主题后,无法在核心数据中配置一对多关系。

在我的应用程序中,我通过以下代码将所有新用户信息保存在名为Users的实体中:

 Users *dataUsers = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:_managedObjectContext];

    [dataUsers setUsername:usernameRegistration.text.capitalizedString];
    [dataUsers setPassword:passwordRegistration1.text];
    [dataUsers setEmailAddress:mail1.text];
    [dataUsers setRightOrLeft:[NSNumber numberWithInteger:rightOrLeftHanded.selectedSegmentIndex ]];



    NSError *error = nil;
    if(![_managedObjectContext save:&error]) {
        //handle the error
    }

现在我在不同的视图控制器中调用所有这些信息来执行识别用户名 - 密码并访问下一页。

AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication]delegate];
_managedObjectContext=[appDelegate managedObjectContext];    

NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *usersDescription= [NSEntityDescription entityForName:@"Users" inManagedObjectContext:_managedObjectContext];
[request setEntity:usersDescription];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"username" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];



NSError  *error = nil;
NSMutableArray *mutableFetchresults = [[_managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
if(mutableFetchresults == nil) {
    //handle error
}
[self setUsersData:mutableFetchresults];
// different steps for the recognition

好的,每个用户都可以登录并访问下一页。

现在,在下一页中,用户必须创建一个新会话。所以我创建了一个名为Sessions的新实体。每个用户可以有多个会话,但每个会话只与一个用户链接。

 Sessions *session = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions" inManagedObjectContext:_managedObjectContext];
NSNumber *howManySwingsSessionSaved = [NSNumber numberWithInteger:howManySwingsSession];
[session setName:_sessionNameTextField.text];
[session setHowManySwings:howManySwingsSessionSaved];
[session setClub:choosenClub];
NSDate *dateSaved = [NSDate date];
[session setDate:dateSaved];


NSError *error = nil;
if(![_managedObjectContext save:&error]) {
    //handle the error
}

每个会话都已成功保存。 所以我的问题是:我如何链接与连接到我的应用程序的当前用户创建的新会话? 我想获得当前用户并为他添加这个新会话。 实际上我的代码分别保存每个用户和每个会话。

非常感谢所有帮助:)

谢谢你们!

编辑: 我已经在xcdmodel

中创建了这个关系

2 个答案:

答案 0 :(得分:0)

  

我想获得当前用户并为他添加这个新会话。其实   我的代码分别保存每个用户和每个会话。

您尚未向我们展示该模型,但您似乎需要向实体添加关系。您的Session实体需要与User建立一对一的关系,而反向关系应该是从UserSession的多对多关系。完成后,选择模型中的实体并使用Editor-> Create NSManagedObject Subclass ...`命令为每个实体生成子类。如果查看生成的头文件,您将找到一些可用于创建对象之间关系的访问器。您可能甚至不需要使用它们 - 例如,您可以执行以下操作:

Sessions *session = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions" inManagedObjectContext:_managedObjectContext];
session.user = theCurrentUser;

答案 1 :(得分:0)

我终于成功了!!!! 可能有更好的解决方案,但这个可行,我希望它可能对将来的其他人有所帮助

在用户创建新会话的.m中

Sessions *session = [NSEntityDescription insertNewObjectForEntityForName:@"Sessions"     inManagedObjectContext:_managedObjectContext];
NSNumber *howManySwingsSessionSaved = [NSNumber numberWithInteger:howManySwingsSession];
[session setName:_sessionNameTextField.text];
[session setHowManySwings:howManySwingsSessionSaved];
[session setClub:choosenClub];
NSDate *dateSaved = [NSDate date];
[session setDate:dateSaved];

//我在Sessions中插入一个新会话

for (int i = 0; i< [usersData count]; i++)
{ Users* users = (Users *) [usersData objectAtIndex:i];
if ([users.username isEqualToString: @"your_username"])
{
    Users * currentUser = [usersData objectAtIndex:i];
    [currentUser addSessionObject:session];
}

}

//我将usersData的每个用户名与我想要的用户名进行比较,我将其定义为currentUser,最后我添加了创建的会话。

NSError *error = nil;
if(![_managedObjectContext save:&error]) {
    //handle the error
}

//我保存全部