如何在一对多核心数据关系中获取特定数据?
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