2016-12-30 13 views
0

私はコアデータの関係について1つのサンプルデモを行いました。私は1つのテーブル "ユーザー"を持っています。1対多のコアデータ関係に特定のデータをフェッチする方法は?

コード

-(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を見つけることができませんでした

ある

です。

私の質問は、アカウントの詳細を手動で3人挿入することです。

今、私は携帯電話番号を入力するときに特定の人のために入力した残高があります。

ex

1)最初のモバイル番号を入力します。最初の人の残高を表示する必要があります。 2)2nd Mobile Numを入力します。二人目のバランスを表示する必要があります。 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私が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-many-relationships-fetching-specific-related-entities?rq = 1 – Amanpreet

+0

私はすでにcheしていますそれらの2つのリンクをcked。ありがとう – hd1344

+0

[CoreDataのNSSetのオブジェクト値を一致させるにはどうすればいいですか?](http://stackoverflow.com/questions/41372977/how-to-match-object-value-of-nsset- – Joshua

答えて

2

まず...

はあなたの関係の命名を修正します。他の人があなたの他の質問にコメントしているように、あなたはそれらの名前を先頭に戻しました。Personエンティティでは、Accountの多対多関係は「人」ではなく「アカウント」にする必要があります。同様に、Accountエンティティでは、Personへの1対1の関係は、「アカウント」ではなく「人」という名前にする必要があります。

次...

あなたは対多として「アカウント」の関係を定義しているが、この問題のsavePersonDataコードは一つだけAccountと1 Personを作成する - が、その後の関係を設定しません。それら。 (あなたはあなたの出力でこれを見ることができます:それぞれAccountは "accounts"関係のためにnilを持っています)。

以前の質問のコードでは、newPersonオブジェクトの関係にnewAccountを追加して関係を設定しました。

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

をが、1対多の関係で逆の関係に設定する方が簡単です:あなたのコードでは、(関係名を固定した後)を使用することができ、上記

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

次...

checkBalanceメソッドでは、 "mobile_no"属性が一致するオブジェクトPersonが正しくフェッチされます。しかし、その後のコードでは、関係を正しく設定していても、ALL Accountオブジェクトがフェッチされます。

特定のPersonに関連するオブジェクトのうち、Accountオブジェクトのみを必要とする場合は、正確には「accounts」リレーションシップが表すものです。

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]; 
    } 
:関係を横断述語を指定することで、(最初 Personオブジェクトを取得せずに)直接関係 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オブジェクトにアクセスするには、その関係を使用することができます

+0

ありがとうございました。とてもたくさん働いています。たくさんのpbasdf。 – hd1344

関連する問題