2011-02-19 18 views
1

コアデータは本当に新しいですが、私はチュートリアルを見て、それを理解しています。しかし、私はまだどこでも見つけることができない1つの質問があります。本当にシンプルなようですが、ここはそうです。コアデータの編集属性

1.name
2.position

名がすでに入力されている場合は、私は、ユーザーがテキストフィールドにテキストを入力し、それを割り当てることができかもしれない方法:私は1つのエンティティが言うことができます内の2つの文字列を持っているとしたら後で彼らの位置に?たとえ重複がないと考えると、20人の名前があったとしても?

私はそれがこのようなものかもしれないと思っていました...しかし、それは動作しないようです。

UserInfo *userInfo = (UserNumber *)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:managedObjectContext]; 

if ([userName isEqualToString:"@James"]) { 
    userInfo.Position = nameField.text; 
} 

答えて

7

上記のコードでは、(UserNumber *)を(UserInfo *)として宣言するオブジェクトにキャストしていますか?あなたがそれをやっている理由は何ですか?

あなたの質問が正しく理解されていれば、ユーザー名があらかじめ入力されたレコードを作成し、そのレコードを後で更新できるようにしたいと考えています。

あなたのエンティティはUserInfoと呼ばれ、userNamepositionの2つのNSStringプロパティが作成されているものとします。また、UserInfoのクラスファイルを作成し、ヘッダーを関連するView Controllerにインポートしたと仮定します。ここで

は、あなたがそれを行うだろう方法は次のとおりです。

1)まず、あなたがUITextField *userNameFieldで入力したユーザー名を持っていると仮定し、の新しいレコードを作成してみましょう。

UserInfo *userInfo = (UserInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext]; 
[userInfo setValue:userNameField.text forKey:@"userName"]; 

これは、管理対象オブジェクトコンテキストにUserInfoの新しいインスタンスを作成し、userNameField.text

上の値にuserNameの値を設定する場所彼らができるそして、後の段階でユーザーがポイントになりますあなたのアプリでそのレコードを更新してください(あなたはここで認証について考える必要があります)。 fetchRequestは、彼らがfetchRequestArrayに保存されます、あなたのuserNameField.textのparamaterに一致(複数可)を見つけた場合は

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"(userName == %@)", userNameField.text]; 
[fetchRequest setPredicate:userNamePredicate]; 
NSEntityDescription *userInfo = [NSEntityDescription entityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:userInfo]; 
NSError *error; 
NSArray *fetchRequestArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

:あなたは、あなたの指定したユーザー名と一致するレコードをフェッチします。 userNameプロパティを必須で一意にするために必要な手順を実行する場合は、そこに最大1つのオブジェクトしか存在しません。

配列にobjectAtIndex:0をつかんによるアクセスオブジェクトを、それがpositionプロパティの変更:上記のいずれの場合も

UserInfo *userInfoToBeEdited = [fetchRequestArray objectAtIndex:0]; 
[userInfoToBeEdit setValue:positionTextField.text forKey:@"position"]; 

、変更をコミットする準備ができたら、CoreDataのsaveメソッドを呼び出すことを忘れないでください。保存が呼び出される前に、変更は基本的に永続データのスクラッチパッドである管理対象オブジェクトコンテキストにのみ保持されます。

[EDIT SAVEメソッドを追加する]あなたのコメントを1として

を、私は通常私のAppDelegate(アップルテンプレートから直接コピー/ペースト)

- (void)saveContext 
{ 
    error = nil; 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
     { 
      [self seriousErrorAlert]; 
     } 
    } 
} 

そして、以下に保存する方法を持っています変更を保存する必要があるときは、View ControllerからAppDelegateへの参照を取得して消してください。

+0

それをCoreDataに保存する方法を教えてください。 \t NSError * error; \t if(![managedObjectContext save:&error]){ \t} –

+0

@JamesDunayはsaveメソッドを追加したばかりで、私はそれを私の答えにどのように呼び出すでしょうか。それが役に立てば幸い! – Rog

関連する問題