如何在一对多核心数据关系中获取特定数据?

Posted

技术标签:

【中文标题】如何在一对多核心数据关系中获取特定数据?【英文标题】:How to fetch Specific Data in One to Many Core Data Relationships? 【发布时间】:2016-12-30 04:27:47 【问题描述】:

我做了一个关于核心数据关系的示例演示。我有一个表“用户”,它以“一对多”关系的形式连接到另一个表“帐户”。

代码

-(IBAction)savePersonData:(id)sender


    NSManagedObjectContext *context = appDelegate.managedObjectContext;

    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    [newDevice setValue:self.personName.text forKey:@"name"];
    [newDevice setValue:self.personAddress.text forKey:@"address"];
    [newDevice setValue:self.personMobileNo.text forKey:@"mobile_no"];


    NSManagedObject *newAccount = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context];
    [newAccount setValue:self.accountNo.text forKey:@"acc_no"];
    [newAccount setValue:self.accountType.text forKey:@"acc_type"];
    [newAccount setValue:self.balance.text forKey:@"balance"];

    NSLog(@"Saved Successfully");
    [self dismissViewControllerAnimated:YES completion:nil];


图片是

我的问题是

我找了很多时间,但找不到正确的答案。所以我第二次发布这个问题。

我的问题是我已经手动插入三个人及其帐户详细信息。

现在,我想要一个我在输入手机号码时为特定人输入的余额。

1)输入第一个手机号码。应该显示第一个人的余额。 2)输入第二个手机号码。应该显示第二个人的余额。 1)输入第三个手机号码。应该显示第三人称的余额。

余额校验码

-(IBAction)checkBalance:(id)sender

 NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mobile_no = %@",self.textField.text];

    [fetchRequest setPredicate:predicate];
    NSError *error;
    NSArray *result = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if(!([result count] == 0))
            

        NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
        NSFetchRequest *newFetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Account"];
        NSMutableArray *temp = [[managedObjectContext executeFetchRequest:newFetchRequest error:nil] mutableCopy];

        for (NSManagedObject *object in temp)
        
            NSString *intValue = [object valueForKey:@"balance"];
            NSString *alertString = [NSString stringWithFormat:@"%@",intValue];
            [self displayAlertView:@"Available Balance" withMessage:alertString];
        
    
    else
    
        [self displayAlertView:@"Error" withMessage:@"Please Enter Valid Mobile Number That you have entered in Bank"];
    

图片

输出

我想与特定人员保持平衡,我在 TextField 上输入 Person Mobile No。

对不起各位,我已经问了第二次了,但是无法解决这个核心数据关系。

谢谢。

【问题讨论】:

你检查过***.com/questions/20157803/… 和这个***.com/questions/8310652/… 我已经检查了这两个链接。谢谢 How To Match object value of NSSet in CoreData?的可能重复 哥们,你是对的,这是对的,但无论你回答什么,只有匹配的电话号码而已...... 【参考方案1】:

首先...

修正关系的命名。正如其他人在 cmets 中就您的其他问题所指出的那样,您已将它们从前命名:在Person 实体中,与Account 的一对多关系应命名为“帐户”而不是“人员”。同样在Account 实体中,与Person 的一对一关系应命名为“person”而不是“accounts”。

下一步...

尽管您已将“帐户”关系定义为对多,但此问题中的 savePersonData 代码仅创建一个 Account 和一个 Person - 但不会设置它们之间的关系。 (您可以在输出中看到这一点:每个Account 的“帐户”关系都为零)。

您上一个问题中的代码确实设置了关系(通过将newAccount 添加到newPerson 对象的关系中)。在您上面的代码中,您可以使用(在修复关系名称之后):

NSMutableSet *setContainer = [newDevice mutableSetValueForKey:@"accounts"];
[setContainer addObject:newAccount];

但是对于一对多关系,设置反向关系更容易:

[newAccount setValue:newDevice forKey:@"person"];

下一步...

您的checkBalance 方法可以正确获取任何“mobile_no”属性匹配的Person 对象。但是您随后的代码会获取所有 Account 对象 - 即使您已正确设置了关系。

如果您只想要那些与给定Person 相关的Account 对象,那么这正是“帐户”关系所代表的内容。因此,您可以使用该关系来访问相关的 Account 对象:

if(!([result count] == 0)) 
    NSManagedObject *requiredPerson = (NSManagedObject *)result[0];
    NSSet *temp = [requiredPerson valueForKey:@"accounts"];
    for (NSManagedObject *object in temp) 
        NSString *intValue = [object valueForKey:@"balance"];
        NSString *alertString = [NSString stringWithFormat:@"%@",intValue];
        [self displayAlertView:@"Available Balance" withMessage:alertString];
    

或者,通过指定遍历关系的谓词直接获取相关的Account 对象(无需先获取Person 对象):

NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
NSFetchRequest *newFetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Account"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"person.mobile_no = %@",self.textField.text];
[newFetchRequest setPredicate:predicate];

NSMutableArray *temp = [[managedObjectContext executeFetchRequest:newFetchRequest error:nil] mutableCopy];

    for (NSManagedObject *object in temp)
    
        NSString *intValue = [object valueForKey:@"balance"];
        NSString *alertString = [NSString stringWithFormat:@"%@",intValue];
        [self displayAlertView:@"Available Balance" withMessage:alertString];
    

【讨论】:

非常感谢您的完美工作。非常感谢 pbasdf。

以上是关于如何在一对多核心数据关系中获取特定数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 coreData 中获取一对多关系并放入 tableview

核心数据 - 以一对多关系访问实例与获取请求?

快速获取具有一对多关系的核心数据

一对多关系核心数据:在prepareForSegue中获取:

如何使用 Django 查询从一对多关系中获取数据

一对多关系核心数据获取数据