magicalrecord eliminar datos no importados

Imagine la siguiente relación en CoreData

Recipe < --- >> Ingnetworkingient 

Estoy usando MagicalRecord para importar periódicamente la database del server (API JSON) con mi database local CoreData.

Entonces, si importe la Recipe 1 con el Ingnetworkingient 1 así:

 { id:1, name: "Recipe 1", ingnetworkingients: [{ name: 'Ingnetworkingient 1' }] } 

Entonces, para que sea tan bueno, MagicalRecord crea las dos entidades y las vincula.

El problema aparece cuando el server cambia a lo siguiente:

 { id:1, name: "Recipe 1", ingnetworkingients: [{ name: 'Ingnetworkingient 2' <-- Notice here }] } 

Lo que hace MagicalRecord es crear el logging de Ingnetworkingient 2 (correcto), vincularlo para que sea el único ingnetworkingiente de la Recipe 1 (correcta). Pero si busco Ingnetworkingientes, encontré 2 loggings en mi database CoreData.

Entonces, las preguntas son: ¿es posible hacer un seguimiento de los objects "eliminados" al importarlos y eliminarlos?

El verdadero problema aquí es que MagicalRecord parece importar duplicates. Este problema debería haberse resuelto en una actualización reciente, sin embargo, si todavía tiene problemas, sugiero abrir un ticket en la página de problemas del proyecto

He trabajado alnetworkingedor de este problema siguiendo este process.

  1. Ejecute una consulta en su almacén de datos central que le devolverá los valores que espera para una request de server determinada. Encuentre todos los ID del object para cada object encontrado por la consulta que se espera que el server devuelva.
  2. Realice la request del server e importe los datos.
  3. Antes de save, obtenga todos los objects actualizados del context que acaba de usar para importar los datos.
  4. Elimine cualquier object en su list original de objectIDs que no esté en su list de objectID actualizados.

Este enfoque debe lograr el comportamiento deseado para cualquier request dada. Solo tenga en count que posiblemente esté eliminando los loggings a los que se hace reference en otros lugares, por lo que solo use este enfoque si pueden volver a crearse mediante otras requestes futuras.

Importar código

 NSArray *existingObjectIDs = [self existingObjectIDsForYourQuery]; [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { [Recipe MR_importFromObject:response inContext:localContext]; NSArray *objectIDs = [[[localContext updatedObjects] allObjects] valueForKey:@"objectID"]; [self deleteLocalObjectsWithObjectIDs:existingObjectIDs excludingImportedObjectIDs:objectIDs]; }]; 

Eliminar código

 - (void)deleteLocalObjectsWithObjectIDs:(NSArray *)existingObjectIDs excludingImportedObjectIDs:(NSArray *)importedObjectIDs { NSMutableArray *objectsToDelete = [NSMutableArray arrayWithArray:existingObjectIDs]; for ( NSManagedObjectID *objectID in importedObjectIDs ) { [objectsToDelete removeObject:objectID]; } [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { for ( NSManagedObjectID *objectID in objectsToDelete ) { NSManagedObject *object = [localContext existingObjectWithID:objectID error:nil]; if ( object ) { [localContext deleteObject:object]; } } }]; } 

No puede simplemente cambiar el nombre de Ingnetworkingient en el server si esto es lo que está utilizando como key principal. MagicalRecord y Core Data no tienen idea de qué logging se ha actualizado, todo lo que sabe es que no existe ningún Ingnetworkingient con ese nombre y creará un nuevo logging para usted y mapeará la relación de Recipe . Deberá eliminar manualmente cualquier logging en la database de su aplicación local que no exista en la carga útil de JSON.

Considera lo siguiente:

No tiene una key primaria para su object Ingnetworkingient . Debe dejar que MagicalRecord sepa qué key es primaria (cuando no existe ningún atributo "ingnetworkingientID").

Para ello, ingrese a su model de datos básicos y select la entidad de Ingnetworkingient . A continuación, agregue una key "relatedByAttribute" en la información del usuario en el inspector del model de datos, con "nombre" como valor.

Luego ingrese a su entidad Recipe , select la relación para Ingnetworkingient y agregue una key "relatedByAttribute" y un valor de "nombre" en el dictionary del usuario para la relación. De esta forma, MagicalRecord ahora sabe search los loggings de Ingnetworkingient existentes por el atributo "nombre" y mapeará el logging existente si existe, otros crean una nueva entidad y le enlazan Recipe .

Puede leer más información aquí: http://www.cimgf.com/2012/05/29/importing-data-made-easy/ , especialmente la sección "Relacionado por keys" es de su interés.

Nuevamente, como se mencionó anteriormente, solo ha actualizado el nombre, lo que significa que probablemente debería eliminar cualquier Ingnetworkingient para la Recipe actual. Si elimina el object en el server, también deberá eliminarlo en su database local.

Si todavía tiene problemas, le sugiero que cree una class de categoría en Recipe en la que busque manualmente cualquier logging que coincida con el nombre y cree / actualice en consecuencia. Pero no olvide borrar loggings que no existen en la carga pero existen localmente.