Как обновить существующий объект в основных данных?
когда я вставляю новый объект, я делаю со следующим кодом:
NSManagedObjectContext *context = [appDelegate managedObjectContext];
Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context];
favorits.title = @"Some title";
NSError *error;
if (![context save:&error]) {
NSLog(@"Whoops");
}
Как я могу обновить существующий объект в основных данных?
4 ответа:
обновление просто, как создание нового.
для обновления конкретного объекта необходимо настроить
NSFetchRequest
. Этот класс является эквивалентом выберите высказывания на языке SQL.вот простой пример:
NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:@"Favorits" inManagedObjectContext:moc]]; NSError *error = nil; NSArray *results = [moc executeFetchRequest:request error:&error]; // error handling code
массив
results
содержит все управляемые объекты, содержащиеся в файле sqlite. Если вы хотите захватить определенный объект (или несколько объектов), вам нужно использовать предикат с этим запросом. Для пример:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"]; [request setPredicate:predicate];
в этом случае
results
содержит объекты, где заголовок равенSome Title
. Параметр предиката равно поставить where в инструкции SQL.для получения дополнительной информации я предлагаю вам прочитать руководство по программированию основных данных и
NSFecthRequest
ссылка на класс.надеюсь, что это помогает.
EDIT (фрагмент, который можно использовать для обновления)
// maybe some check before, to be sure results is not empty Favorits* favoritsGrabbed = [results objectAtIndex:0]; favoritsGrabbed.title = @"My Title"; // save here the context
или если вы не используете
NSManagedObject
подкласс.// maybe some check before, to be sure results is not empty NSManagedObject* favoritsGrabbed = [results objectAtIndex:0]; [favoritsGrabbed setValue:@"My title" forKey:@"title"]; // save here the context
в обоих случаях, если вы делаете
save
в контексте данные будут обновлены.
вы должны fetch объект из контекста, изменить свойства, которые вы хотите, а затем сохранить контекст, как вы находитесь в вашем примере.
Я надеюсь, что это поможет u. как это работает для меня.
NSMutableArray *results = [[NSMutableArray alloc]init]; int flag=0; NSPredicate *pred; if (self.txtCourseNo.text.length > 0) { pred = [NSPredicate predicateWithFormat:@"courseno CONTAINS[cd] %@", self.txtCourseNo.text]; flag=1; } else { flag=0; NSLog(@"Enter Corect Course number"); } if (flag == 1) { NSLog(@"predicate: %@",pred); NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"Course"]; [fetchRequest setPredicate:pred]; results = [[self.context executeFetchRequest:fetchRequest error:nil] mutableCopy]; if (results.count > 0) { NSManagedObject* favoritsGrabbed = [results objectAtIndex:0]; [favoritsGrabbed setValue:self.txtCourseName.text forKey:@"coursename"]; [self.context save:nil]; [self showData]; } else { NSLog(@"Enter Corect Course number"); } }
Если вы программист swift, это может помочь вам:
Если вы хотите удалить NSManagedObject
в моем случае ID является уникальным атрибутом для entity STUDENT
/** for deleting items */ func Delete(identifier: String) { let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT") let predicate = NSPredicate(format: "ID = '\(identifier)'") fetchRequest.predicate = predicate do { let object = try context.fetch(fetchRequest) if object.count == 1 { let objectDelete = object.first as! NSManagedObject context.delete(objectDelete) } } catch { print(error) } }
Если вы хотите обновить NSManagedObject :
/** for updating items */ func Update(identifier: String,name:String) { let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "STUDENT") let predicate = NSPredicate(format: "ID = '\(identifier)'") fetchRequest.predicate = predicate do { let object = try context.fetch(fetchRequest) if object.count == 1 { let objectUpdate = object.first as! NSManagedObject objectUpdate.setValue(name, forKey: "name") do{ try context.save() } catch { print(error) } } } catch { print(error) } }