¿Cómo actualizar un objeto existente en Core Data?

Cuando inserto un nuevo objeto lo hago con el siguiente código:

NSManagedObjectContext *context = [appDelegate managedObjectContext]; Favorits *favorits = [NSEntityDescription insertNewObjectForEntityForName:@"Favorits" inManagedObjectContext:context]; favorits.title = @"Some title"; NSError *error; if (![context save:&error]) { NSLog(@"Whoops"); } 

¿Cómo puedo actualizar el objeto existente en los datos centrales?

La actualización es simple como crear una nueva.

Para actualizar un objeto específico, necesita configurar un NSFetchRequest . Esta clase es equivalente a una instrucción SELECT en lenguaje SQL.

Aquí un simple ejemplo:

 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 

Los results matriz contienen todos los objetos gestionados contenidos en el archivo sqlite. Si quiere agarrar un objeto específico (o más objetos), necesita usar un predicado con esa solicitud. Por ejemplo:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", @"Some Title"]; [request setPredicate:predicate]; 

En este caso, los results contienen los objetos donde el título es igual a Some Title . Establecer un predicado es igual a poner la cláusula WHERE en una statement SQL.

Para obtener más información, le sugiero que lea la guía de progtwigción Core Data y la referencia de clase NSFecthRequest .

  • Guía de progtwigción de datos básicos

  • Referencia de clase NSFecthRequest

Espero eso ayude.

EDITAR (fragmento que se puede usar para actualizar)

 // maybe some check before, to be sure results is not empty Favorits* favoritsGrabbed = [results objectAtIndex:0]; favoritsGrabbed.title = @"My Title"; // save here the context 

o si no está utilizando una subclase 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 

En ambos casos, si hace un save en el contexto, los datos se actualizarán.

Debe recuperar el objeto del contexto, cambiar las propiedades que desee y luego guardar el contexto tal como está en su ejemplo.

Espero que esto te ayude. como funciona para mí

  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"); } } 

si eres un progtwigdor rápido, esto puede ayudarte:

si quieres eliminar un NSManagedObject

en mi caso, ID es un atributo único para la entidad ESTUDIANTE

 /** for deleting items */ func Delete(identifier: String) { let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let fetchRequest:NSFetchRequest = 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) } } 

si quiere actualizar un NSManagedObject:

 /** for updating items */ func Update(identifier: String,name:String) { let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext let fetchRequest:NSFetchRequest = 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) } }