2009-10-20 9 views
6

Tengo un contexto de objeto gestionado en memoria llamado importMoc que utilizo para importar registros (por ejemplo, empleados). He analizado un archivo y configurado los objetos de empleado en importMoc con una excepción muy importante. El usuario confirma que desea procesar% d empleados, pero no puedo entender cómo o cuándo establecer la relación "principal" de los empleados (por ejemplo, establecer su departamento).¿Configurando relaciones mientras se importan datos centrales?

Para mis propósitos, todos serán importados en el mismo departamento (que el usuario ya ha seleccionado implícitamente).

Obviamente no puedo configurar las relaciones a través de los dos contextos yo también:

  1. crear un departamento en importMoc y luego cuando fusionar los cambios se fusionan el departamento de "importación" con el departamento "real"?
  2. 2) Fusionar a los empleados y luego buscar a todos los empleados recién importados (de alguna manera !!!) y configurar su departamento entonces?
  3. 3) Alguna otra solución que he pasado por alto?

Parece un problema simple pero por alguna razón (¿pereza? ¿Cansancio? ¿Estupidez?) ¡No sé cómo hacerlo! ¡Todo lo que he intentado hasta ahora parece demasiado complicado y complicado!

¡Gracias de antemano!

Respuesta

0

1/asumir registro de empleado X tiene el nombre Y y ID de departamento 15 (es decir, se refiere al departamento con id 15 a través de una relación)

departamento

2/carga con ID de departamento 15 del contexto de objeto gestionado

3/crear un empleado que hace referencia el objeto creado en (2)

es decir, (nota: código de ejemplo solamente, probablemente no compilar):

NSEntityDescription * departmentED = [NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", deptId]; 

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:departmentED]; 
[request setPredicate:predicate]; 

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

/* create employee */ 

NSEntityDescription * employeeED = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; 
NSManagedObject * employeeMO = [[[NSManagedObject alloc] initWithEntity:employeeED insertIntoManagedObjectContext:moc] autorelease]; 

/* set employee department to department instance loaded above */ 
[receiptObject setValue:[array objectAtIndex:0] forKey:@"department"]; 
+0

Gracias diciu pero eso no responde mi pregunta sobre la mejor manera de establecer relaciones entre dos contextos diferentes (como se recomienda en el Core Guía de programación de datos - Importación eficiente de datos). Debido a limitaciones de tiempo, actualmente he dejado de usar un segundo contexto de objeto gestionado para la importación, pero todavía tengo curiosidad por saber cuál es el enfoque correcto. También encontré la siguiente pregunta reciente, pero las respuestas proporcionadas no son muy satisfactorias: http: // stackoverflow.com/questions/1554623/ilegal-intento-de-establecer-una-relación-xyz-entre-objetos-en-diferente-co – Matthew

4

Si los objetos Department ya se han guardado en una tienda persistente, puede ponerlos en otro contexto de objeto gestionado. Dado que todos los objetos tendrán que vivir en la misma tienda persistente de todos modos (ya que no se permiten las relaciones entre tiendas), debería poder obtener los que necesita en importMoc.

Por ejemplo:

foreach (NSDictionary *record in employeeRecords) { 
    NSManagedObject *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:importMoc]; 
    // Configure employee however you do that 

    NSString *managerID = [record objectForKey:@"someKeyThatUniquelyIdentifiesTheManager"]; 
    NSFetchRequest *managerFetchRequest = [[NSFetchRequest alloc] init]; 
    [managerFetchRequest setEntity:[NSEntity entityForName:@"Manager" inManagedObjectContext:importMoc]]; 
    [managerFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"managerProperty == %@", managerID]]; 
    NSArray *managers = [importMoc executeFetchRequest:managerFetchRequest error:nil]; // Don't be stupid like me and catch the error ;-) 
    [managerFetchRequest release]; 

    if ([managers count] != 1) { 
     // You probably have problems if this happens 
    } 

    [employee setValue:[managers objectAtIndex:0] forKey:@"manager"]; 
} 

También puedes, simplemente hacer una única petición de recuperación para obtener todos los gerentes en importMoc y luego filtrar esa matriz para localizar el más adecuado en cada ocasión. Eso probablemente sería mucho más eficiente. En otras palabras, no haga lo que acabo de decirle :-)

+0

Así que leyendo el manual fino: Si dejo caer el predicado que dijiste ignorar y llamar a [importMoc executeFetchRequest: error:] Obtendré una matriz que contiene todos los administradores (por ejemplo) que se han guardado en una tienda persistente (independientemente de su contexto) MÁS cualquier administrador en el contexto actual (importMoc) independientemente de si se han guardado o no no. ¿Lo entiendo bien? – Matthew

+0

Correcto. El contexto solo importa cuando los objetos están en la memoria. Una vez que se han guardado en la tienda persistente, se pueden buscar en cualquier contexto. – Alex

+0

Solo una nota rápida para decir muchas gracias por esta respuesta, Alex. No me había dado cuenta de que una búsqueda agregaría objetos en un contexto separado si tuviera el mismo coordinador de tienda persistente. ¡Tuve el mismo problema y esta respuesta funcionó para mí! –

Cuestiones relacionadas