1

firstname、lastname、score の 3 つの属性を持つエンティティがあります。人のスコアを姓名で検索し、UILabel に表示することができます (これまでのところとても良いです)。私の問題は、スコア属性を新しい値で更新する方法がわからないことです。検索を実行して古い値を表示するために使用するコードの下。

NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Scorecard" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entitydesc];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname like %@ and lastname like %@", self.firstnameTextField.text, self.lastnameTextField.text];
[request setPredicate:predicate];

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

if(integer.count <= 0){
    self.displayLabel.text = @"No records found";

}

else {

    NSNumber *score;

    for (NSManagedObject *object in integer) {


       score = [object valueForKey:@"score"];

        int x = [score intValue];

       // New Value is going to be the old value + 2
        int y = x + 2;

      //displays old value found
        [self.displayLabel setText:[NSString stringWithFormat:@"old value %d",x]];

    }

}

アップデート #1

属性を更新して保存することはできましたが、新しい整数値を文字列に変換してから整数に戻す必要がありました。私は余分なステップが好きではありません。誰か別の提案があれば教えてください。助けてくれてありがとう。更新されたコードの下。

 NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Scorecard" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entitydesc];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname like %@ and lastname like %@", self.firstnameTextField.text, self.lastnameTextField.text];
[request setPredicate:predicate];

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

if(integer.count <= 0){
    self.displayLabel.text = @"No records found";

}

else {

    NSNumber *score;

    for (NSManagedObject *object in integer) {

        score = [object valueForKey:@"score"];

        int x = [score intValue];
        int y = x + 2;
        NSString* z = [NSString stringWithFormat:@"%d",y];

        [object setValue:[NSNumber numberWithInteger:[z integerValue]] forKey:@"score"];
        [self.displayLabel setText:[NSString stringWithFormat:@"Value updated to %d",y]];
        [context save:&error];

    }

}

更新 2

ケビンの答えのおかげで、問題を解決できました。コア データの属性の整数値を別の整数値に置き換えることができるようになりました。私のコードの下で最終的に動作します。

NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Scorecard" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entitydesc];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname like %@ and lastname like %@", self.firstnameTextField.text, self.lastnameTextField.text];
[request setPredicate:predicate];

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

if(integer.count <= 0){
self.displayLabel.text = @"No records found";

}

else {

NSNumber *score;

for (NSManagedObject *object in integer) {

    score = [object valueForKey:@"score"];

    int x = [score intValue];
    int y = x + 2;

    [object setValue:[NSNumber numberWithInt:y] forKey:@"score"];
    [self.displayLabel setText:[NSString stringWithFormat:@"Value updated to %d",y]];
    [context save:&error];

}

}
4

2 に答える 2

1

前に行ったようにオブジェクトを取得し、そのスコア プロパティを設定します

[object setValue:[NSNumber numberWithInt:y] forKey:@"score"]; 
于 2013-09-05T18:49:36.723 に答える
0

私の最初の提案は、プリミティブを使用する代わりに NSManagedObject のサブクラスを使用することです。これを行うには、コア データ インスペクターを使用し、エンティティ クラスを変更します。

ここで、スコアを変更するには、変更する必要があるオブジェクトを見つけて、値を割り当てる必要があります。値が割り当てられたら、オブジェクトが属する NSManagedObject を保存する必要があります。コンテキストが正常に保存されると、変更は永続的になります。

于 2013-09-05T19:13:10.003 に答える