2016-12-30 106 views
0

我已经做了关于核心数据关系的一个示例演示。我有一个表“用户”,它以“一对多”关系的形式连接到另一个表“帐户”。如何在一对多核心数据关系中获取特定数据?

代码

-(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]; 

} 

图片

我的问题是

我觉得这么多的时间,但找不到合适的answer.So我张贴了这个问题第二次。

我的问题是我手动插入三人账户的详细信息。

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

ex

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

平衡校验码

-(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"]; 
    } 
} 

图片

enter image description here

输出

enter image description here enter image description here

我想余额以SPE cific Person我在TextField上输入Person Mobile No。

对不起,我有第二次问,但是可能无法解决这个核心数据关系。

谢谢。

+0

您是否检查过http://stackoverflow.com/questions/20157803/display-core-data-entity-records-with-relationship-1m?rq=1以及这个http://stackoverflow.com/questions/8310652/core-data-one-to-many-relationships-fetching-specific-related-entities?rq = 1 – Amanpreet

+0

我已经che cked这两个链接。谢谢 – hd1344

+0

[如何在CoreData中匹配NSSet的对象值?](http://stackoverflow.com/questions/41372977/how-to-match-object-value-of-nsset- in-coredata) – Joshua

回答

2

首先...

修复你的人际关系的命名。正如其他人在对您的其他问题发表意见时指出的那样,您已将其命名为:在Person实体中,与Account的多对一关系应命名为“accounts”而非“person”。同样在Account实体中,与Person的一对一关系应该被命名为“person”而不是“accounts”。

下一页...

虽然已定义的“账户”关系,对许多人来说,savePersonData代码在这个问题上只创建一个Account和一个Person - 但不会再设置之间的关系他们。 (你可以在你的输出中看到这个:每个Account对于它的“账户”关系都没有)。

上一个问题中的代码确实设置了关系(将newAccount添加到newPerson对象上的关系中)。在你上面的代码,你可以(在固定关系名称)使用方法:

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

但一对多的关系很容易设置的反比关系:

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

下一页...

您的checkBalance方法可以正确提取任何Person“mobile_no”属性匹配的对象。但是,随后的代码会取回所有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]; 
    } 
+0

谢谢你这么多的工作完美。谢谢很多pbasdf。 – hd1344