使用核心数据更新属性
问题描述:
我有一个具有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];
}
}
答
像以前那样再设置的它的得分财产
[object setValue:[NSNumber numberWithInt:y] forKey:@"score"];
答
我的第一个建议是使用NSManagedObject的子类,而不是使用原语获取的对象。您可以通过使用核心数据检查器并更改实体类来完成此操作。
现在,要对分数进行更改,您需要找到需要更改的对象并分配值。一旦赋值,你需要保存对象所属的NSManagedObject。上下文成功保存后,您的更改将保持不变。
[object setValue:[NSNumber numberWithInteger:[score integerValue]] forKey:@“score”];我添加了这一行代码,因为是一个整数,我想更新的数字,但是当我检查数据的数字没有更新任何建议? – Fxbaez
即时通讯没有看到任何改变导致即时分配旧值,我的坏。任何我可以分配“int y”值的方式?我想我几乎在那里,但我失去了一些东西。 – Fxbaez
更新为int y,对不起 – Kevin