2012-05-13 11 views
54

cuando inserto nuevo objeto que hago con el código siguiente:¿Cómo actualizar un objeto existente en Core Data?

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 objeto existente en los datos básicos?

Respuesta

122

La actualización es tan 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 ejemplo sencillo:

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 

La matriz results contiene todos los objetos gestionados contenidos en el archivo de 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 results contiene los objetos donde título es igual a Some Title. Establecer un predicado es igual a poner la cláusula WHERE en una declaración SQL.

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

espero que ayude.

EDITAR (fragmento que se puede utilizar 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 lo hace un save del contexto, se actualizarán los datos.

+0

@CroiOS Mi ejemplo es muy simple y no tiene en cuenta la gestión de la memoria. –

+0

gracias. ¿Puede actualizar por favor su publicación y agregar código de ejemplo para actualizar este objeto que grabé? Estoy aquí: Favorits * myObject = [array objectAtIndex: 0]; .. ¿que sigue? – CroiOS

+0

@CroiOS He agregado una edición. Como ya comenté, el código es muy simple y debe verificarlo antes. Esto es solo para guiarlo en la modificación de su objeto administrado una vez recuperado. PD Verifica el código porque he escrito a mano. Espero eso ayude. –

11

Tiene que fetch el objeto del contexto, cambie las propiedades que desee y guarde el contexto tal como está en su ejemplo.

+0

bien, obtengo objeto, ¿qué sigue? Ejemplo de pls. – CroiOS

+1

@CroiOS Cambia las propiedades exactamente de la misma manera que las configuró inicialmente. También los guardas exactamente de la misma manera. – sosborn

8

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



}