0

これが私のコードです、

handはエンティティでありaddRounds、textFieldです

-(IBAction)save{

[self dismissViewControllerAnimated:YES completion:nil];
[self.hand setValue:self.addRounds.text forKey:@"rounds"];
    NSError *error;
    if (![self.managedObjectContext save:&error]) {
            //Handle Error
    }
NSLog(@"%@", self.addRounds.text);
NSLog(@"%@", self.hand.rounds);

}

コンソール出力

2012-11-25 16:51:18.847 App[3187:c07] 1
2012-11-25 16:51:18.848 App[3187:c07] (null)

そのため、何らかの理由で、適切に保存されません。誰か助けてくれませんか!ありがとう!

-(IBAction)save{

if (self.managedObjectContext == nil)
{
    self.managedObjectContext = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}


    Hand *hand = [NSEntityDescription insertNewObjectForEntityForName:@"Hand" inManagedObjectContext:self.managedObjectContext];
    [self dismissViewControllerAnimated:YES completion:nil];
    hand.rounds = nil;
    self.managedObjectContext = self.app.managedObjectContext;

    NSError *error;

    if (![self.managedObjectContext save:&error]) {
         //Handle Error
    }

}

編集

つまり、基本的には合計4つのビューがあります。1)テーブルビューで表示、ユーザーは「+」ボタンを押すことができます2)このビューでは、ユーザーはテーブルビューにセルを追加できます3)ユーザーはテーブルビューセルに追加できますedit4)これは完全に異なるビューであり、テーブルビューのセルを編集するユーザー。

質問の上部にあるコードを使用して、両方のビューに保存しています3 & 4。ビュー3では完全に機能しますが、4では機能しません!!

アップデート!!!

そこで、ビュー1と4がアプリ内の2つのビューだけになるように、アプリを再コーディングしました。pushビュー1とビュー4の間にビュー2とビュー3があると、managedObjectContextの属性がに設定さroundsnullます。

4

1 に答える 1

1

手のエンティティのrounds属性は、モデル内の文字列ですか?

まず、手のエンティティのラウンド属性のタイプを数値タイプに設定する必要があります。16ビット整数でおそらく十分ですが(カードゲームについて話しているのですよね?)、必要に応じてもっと大きくすることもできます。

次に、コードを次のように変更します。

-(IBAction)save{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
NSNumber *rounds = [numberFormatter numberFromString:numberself.addRounds.text];

[self dismissViewControllerAnimated:YES completion:nil];
[self.hand setValue:rounds forKey:@"rounds"];
    NSError *error;
    if (![self.managedObjectContext save:&error]) {
            //Handle Error
    }
NSLog(@"%@", self.addRounds.text);
NSLog(@"%@", self.hand.rounds);

また、この時点より前のどこかにプロパティを設定している手のインスタンスを挿入したと仮定します。多分私は仮定するべきではありません。ストア内のデータを指すように、この管理対象オブジェクトインスタンスself.handをすでに初期化していますか?

たとえば、私は怠惰なインスタンス化を使用するのが好きです:

- (Hand*)hand
{
    if (_hand = nil) {
        _hand = [NSEntityDescription insertNewObjectForEntityForName:@"Hand" inManagedObjectContext:self.managedObjectContext];
    }
    return _hand;
}

これは、純粋に作成指向の設計を前提としています。ほとんどの場合、既存のオブジェクトを編集して、そのラウンド数を更新する必要があります。このためには、最初に編集しているハンドを取得するようにしてください。NSFetchRequestを使用してこれを行うと、その例が無数にあるため、ここでは繰り返しません。一致するものがなかった場合、このゲッターはフォールバックとして一致するものを作成します。また、ベストプラクティスは、さまざまなハンドを取得、作成、および共通のプロパティを更新するためのメソッドを含む、ハンドのカテゴリ(Hand + Edit.mなど)を作成することです。

次のように、Handオブジェクトカテゴリ内にワーカーメソッドを作成します。

+ (void)incrementRoundsOnHand:(Hand *)hand withManagedObjectContext:(NSManagedObjectContext *)context
+ (void)incrementRoundsBy:(NSUInteger)count onHand:(Hand *)hand withManagedObjectContext:(NSManagedObjectContext *)context
// or some sort of unique identifier, date, number, etc
+ (Hand *)handWithName:(NSString *)name withManagedObjectContext:(NSManagedObjectContext *)context 

次に、handWithName :(またはその他)にNSFetchRequestを実行させ、一致するものがない場合は、新しいハンドを作成して返します。いずれにせよ、あなたは手を取り戻します。重要なのは、Hand管理対象オブジェクトクラスの外部でHandエンティティの詳細を操作しないことです。これらはクラスメソッドであるため、直接呼び出すことができることに注意してください。

于 2012-11-26T03:26:46.930 に答える