2012-04-19 27 views
1

コアデータの編集/保存には苦労しており、これについてはいくつかの助けが必要です。私はNSFetchedResultsControllerを使用しており、コアデータのfirst_name、last_name、email_idなどの属性を持つGolferという名前のエンティティを持っています。だから、私はどのようにデータベースからゴルファーを追加したり、削除するかを知っています。コアデータエンティティ内の属性の編集/保存

私は、ViewManager(私のすべてのクラスについてある種の基本ビュー)という1つのビューコントローラに取り組んでおり、その中に2-3個のカスタムUIViewがあります。私はそれらを必要に応じていつでも出入りすることができます。

私はゴルファーをtableviewに追加してからdidSelectRow tableviewメソッドで同じViewManagerコントローラ内に表示し、次のコードを使用してテキストビューを編集ビューで更新しようとします。テーブルビューと私のために働いていない。どんな助けでも大歓迎です。

- (IBAction)saveEditGolfersView:(id)sender 
{ 
    AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext * context = [applicationDelegate managedObjectContext]; 

    // Retrieve the entity from the local store -- much like a table in a database 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Golfer" inManagedObjectContext:context]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Set the sorting -- mandatory, even if you're fetching a single record/object 
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES]; 

    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptors release]; sortDescriptors = nil; 
    [sortDescriptor1 release]; sortDescriptor1 = nil; 

    NSError * error; 

    NSArray * objects = [context executeFetchRequest:request error:&error]; 

    for(int i = 0; i<[objects count]; i++) 
    { 
     Golfer * golfguy = [objects objectAtIndex:i]; 

     golfguy.first_name = mEditFirstName.text; 
     golfguy.middle_name = mEditMiddleName.text; 
     golfguy.last_name = mEditLastName.text; 
     golfguy.email_id = mEditEmailField.text; 
     golfguy.contactNumber = mEditContactNum.text; 
     golfguy.picture = mEditPictureView.image; 

     NSLog(@"name-%@", golfguy.first_name); 
    } 

    [request release]; request = nil; 

    error = nil; 
    [context save:&error]; 

    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut 

        animations:^ { 

         mEditGolfersView.frame = CGRectMake(-480, mEditGolfersView.frame.origin.y, mEditGolfersView.frame.size.width, mEditGolfersView.frame.size.height); 

        } 

        completion:^(BOOL finished) { 
         mEditGolfersView.hidden = YES; 

        }]; 
} 

答えて

1

私が正しいこのコードを読んでいる場合は、-(IBAction)saveEditGolfersView:(id)senderへの呼び出しは、私はあなたが望むものではありません期待して、正確な特性を有する全てのゴルファーを設定します。

私は問題が何であるかはっきりしていませんが、正しいゴルファーを変更するためにNSFetchRequestと一緒に行くにはNSPredicateが必要だと仮定しています。

多分私は何かを見逃していたかもしれませんが、このコードは私に言います。「おい、私はデータベースにすべてのゴルファーをロードし、ファーストネームで注文してから、このページのテキストフィールド "を参照してください。悪いニュースのように聞こえる...

ただ1人のゴルファーを編集するには、編集しているゴルファーを必ずいくつかの場所に保管してください。 applicationDelegateに格納されたmanagedObjectContextを保持するので、それは生き続けるため、コアデータオブジェクトを有効に保ちます。これは、セーブ・ビューで行う高価なフェッチを回避します。ただし、ゴルファーオブジェクトへの参照を保持しない場合は、NSManagedObjectにはobjectIdがあり、これはコアデータで使用される識別子です。あなたはそのようにフェッチ述語でobjectIdを使用することができます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId == %@", self.editingGolferObjectId]; 
[request setPredicate:predicate]; 

私は私に戻って取得するために、むしろobjectId

+0

おかげショーンよりも、あなたのケースでは、オブジェクトへの参照を保持することを選択します。このIBActionメソッドは、情報(名前、電子メールID、画像などのゴルファー情報を更新するとき)を保存することです。私のコードで何が問題になっていますか?私はフェッチ要求を実行する際にそれらをループしていると思いますか? –

+0

編集コントローラの特定のゴルファーを変更しようとしていませんか?あなたは何人のゴルファーを変えようとしていますか? –

+0

テーブルビューで行を選択した方法をタップして、特定のゴルファーを編集しようとしています。コードのルーピングは間違っていますが、編集しようとしている各ゴルファーのインデックスを取得するにはどうすればよいですか?私を助けてください! –

関連する問題