2016-12-30 104 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