Come aggiornare l’object esistente in Core Data?

Quando inserisco un nuovo object, lo faccio con il seguente codice:

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

Come posso aggiornare l’object esistente nei dati principali?

L’aggiornamento è semplice come crearne uno nuovo.

Per aggiornare un object specifico è necessario impostare un NSFetchRequest . Questa class è equivalente a un comando SELECT in linguaggio SQL.

Ecco un semplice esempio:

 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 

I results dell’array contengono tutti gli oggetti gestiti contenuti nel file sqlite. Se vuoi prendere un object specifico (o più oggetti) devi usare un predicato con quella richiesta. Per esempio:

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

In questo caso i results contengono gli oggetti in cui il titolo è uguale a Some Title . L’impostazione di un predicato equivale a inserire la clausola WHERE in un’istruzione SQL.

Per ulteriori informazioni ti suggerisco di leggere la guida alla programmazione di Core Data e il riferimento alla class NSFecthRequest .

  • Guida alla programmazione dei dati di base

  • Riferimento alla class NSFecthRequest

Spero che sia d’aiuto.

EDIT (snippet che può essere utilizzato per aggiornare)

 // 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 se non si sta utilizzando una sottoclass 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 

In entrambi i casi, se si save il contesto, i dati verranno aggiornati.

Devi recuperare l’object dal contesto, modificare le proprietà che desideri, quindi salvare il contesto come sei nell’esempio.

Spero che questo ti possa aiutare. come funziona per me.

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

se sei un programmatore veloce questo ti può aiutare:

se si desidera eliminare un object NSManaged

nel mio caso l’ID è un attributo unico per l’ quadro STUDENT

 /** 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) } } 

se si desidera aggiornare un object NSManaged:

 /** 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) } }