2010-11-04 14 views
24

Tengo los conceptos básicos sobre la inserción de registros y la eliminación de registros con Core Data; sin embargo, agradecería ayuda con una de las funciones más comunes: insertar/actualizar.Cómo realizar una inserción/actualización con datos centrales

Básicamente, uso NSMutableArrayarrayWithContentsOfURL para obtener una matriz que contiene filas de una tabla mysql. Lo que tengo que hacer ahora es sincronizar mi tienda CoreData.

En otras palabras, necesito agregar cada fila en la matriz a mi tabla CoreData pero si ya existe necesito actualizar el registro con los últimos valores. Además, si existe en Core Data y no en la matriz descargada, necesitaría eliminarla.

Probablemente podría hackear esto juntos; sin embargo, me gustaría ver cómo se hace de forma adecuada y eficiente sin pérdidas de memoria.

+0

sé que es tarde, pero si está eliminando elementos de los datos centrales que no existen en la matriz, ¿por qué no acaba de eliminar todos los elementos de los datos centrales e inserta todos los nuevos? insertar vs actualizar las que existen es probablemente mucho más fácil. – Ben

+0

@Ben: buena sugerencia, pero ¿no sería potencialmente mucho más lento? Especialmente en el caso de una tabla con muchas entradas y solo una pareja que necesita ser cambiada. Hacer tanta escritura cuando no la necesites puede ser significativa, ¿no? – GeneralMike

+0

@GeneralMike sí definitivamente más eficiente si tienes muchas filas. En ese momento no había aprendido la forma correcta de hacerlo :) – Ben

Respuesta

34

Hay dos formas de insertar datos en los datos principales, y cualquiera que utilice depende de usted. Sin embargo, uno de ellos depende de si ha generado clases de modelo para su modelo de datos para el db de datos centrales.

La forma más habitual es utilizar la siguiente:

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setValue:@"value1" forKey:@"stringColumn"]; 
[object setValue:12 forKey:@"numberValue"]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Esto es suponiendo que ya tienes fija su contexto de objeto gestionado para arriba. Es mucho más eficiente si crea e inserta sus objetos en el contexto en un bucle, y luego lo guarda después de que termine el ciclo.

El otro método no es muy diferente, pero es mucho más seguro en términos de seguridad de tipo. Si ha generado clases de modelo (que puede hacer desde el xcdatamodels), entonces simplemente puede crear un objeto de esa clase y establecer sus propiedades.

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setStringColumn:@"value1"]; 
[object setNumberValue:12]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Para eliminar de una tabla, sólo tiene que recuperar el objeto de la mesa (estoy asumiendo que está usando el segundo método aquí para inserciones, y como tal han generado las clases del modelo) y utilizar los siguientes:

[context deleteObject:object]; 

Tenga en cuenta que deberá llamar a guardar para que también surta efecto.

Espero que esto ayude! ¡Buena suerte!

EDITAR: ¡Lo siento, debo haber leído mal la pregunta!

Para examinar un registro existente, querrá crear una solicitud de obtención y luego ejecutarla en el contexto de su objeto gestionado. Como mínimo, una solicitud de obtención requiere una entidad (para que sepa en qué tabla buscar). Para especificar los términos de búsqueda, deberá crear un predicado (de lo contrario, la solicitud simplemente devolverá todo en la tabla). También puede especificar un conjunto de descriptores de clasificación para que sus resultados sean ordenados.

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context]; 
[request setEntity:entity]; 

NSError *errorFetch = nil; 
NSArray *array = [context executeFetchRequest:request error:&errorFetch]; 

Este código crea una solicitud de búsqueda, y devuelve todos los objetos de la tabla denominada "mesa" en una matriz. Desde aquí, dado que todos los objetos necesarios se encuentran en la matriz, puede inspeccionar y editar los registros. Si realiza algún cambio, recuerde guardar el contexto! El siguiente ciclo registra el primer valor en cada objeto, utilizando la misma tabla que los ejemplos anteriores.

for(TableObject *object in array) 
{ 
    NSLog(@"object value1 = %@", object.value1); 
} 

También puede eliminar registros de este punto con la función mencionada anteriormente.

Para obtener más información acerca de las Solicitudes de obtención, por favor brinde un vistazo a class reference. También recomendaría leer acerca de los descriptores y predicados, ya que son muy importantes para buscar datos básicos y algunos usos son menos eficientes que otros (especialmente en la creación de NSPredicates).

¡Buena suerte!

+0

Hola Andrew, gracias por la respuesta. Ya entiendo cómo insertar registros en Core Data usando NSManagedObject como mencioné en la pregunta. Estoy buscando ayuda con el código para examinar los registros que ya existen en Core Data y luego actualizarlos, eliminarlos o insertar nuevos basados ​​en los registros en un NSMutableArray que he descargado. – slevytam

Cuestiones relacionadas