2012-02-16 12 views
8

después de leer las Object Mapping-Guide on GitHub para RestKit mi problema no desapareció, así que quizás alguien puede decir si RestKit podía tratar con la siguiente idea.RestKit relaciones de correspondencia objeto sin KVC

entidades con relaciones

Company 
- unitID 
- companyID 
- name 
- contacts* (Company -->> Contact | 1:n) 

Contact 
- unitID 
- companyID 
- contactID 
- lastName 
- firstName 
- account* (Contact >--> Company | 1:1) 

JSON (Empresa)

[ 
    { 
     "unitID":"003CABD8DEB5DC13C", 
     "companyID":"BSP-002999", 
     "name":"Testcompany" 
    } 
] 

JSON (Contacto)

[ 
    { 
     "unitID":"DAC2ACCC125795D00", 
     "companyID":"BSP-002999", 
     "contactID":"CLP-015468", 
     "firstName":"Mister", 
     "lastName":"Wayne" 
    } 
] 

Debido a las limitaciones no soy capaz de anidar los contactos que pertenecen a las empresas (de lo contrario no iba a escribir esto), por lo que quieren hacer este uso cuando los datos se mapea en la importación.

Pregunta

¿Es posible asignar cada contacto a él es que pertenece la empresa (identificado por el atributo CompanyID) en las importaciones con métodos dados por RestKit?

Si no es así, me gustaría saber la mejor solución para ello. ¡Gracias!


Antecedentes

En mi primera construcción de esta aplicación que he asignado los objetos a las entidades dadas (sin relación) y fui a buscar todos los contactos que pertenecen a una empresa con el predicado CompanyID =% @. Debido a la cantidad de datos (4000 + 7000 + Empresas, Contactos) ir a buscar todos los contactos que pertenecen tarda aproximadamente un segundo - por lo que se me ocurrió la idea de utilizar relationsships (que funciona perfecto con datos ficticios locales).


Solución

Con la ayuda de la respuesta dada a mi asignación actual se parece a la siguiente (v.10 RestKit).

// Setting up Restkit with objectStore 
... 

// Init objectMapping for Class Company 
companyMapping = [RKManagedObjectMapping mappingForClass:[Company class] inManagedObjectStore:objectStore]; 
[companyMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[companyMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[companyMapping mapKeyPath:@"name" toAttribute:@"name"]; 
companyMapping.setDefaultValueForMissingAttributes = NO; 
companyMapping.primaryKeyAttribute = @"companyID"; 

// Init objectMapping for Class Contact 
contactMapping = [RKManagedObjectMapping mappingForClass:[Contact class] inManagedObjectStore:objectStore]; 
[contactMapping mapKeyPath:@"unitID" toAttribute:@"unitID"]; 
[contactMapping mapKeyPath:@"companyID" toAttribute:@"companyID"]; 
[contactMapping mapKeyPath:@"contactID" toAttribute:@"contactID"]; 
[contactMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
[contactMapping mapKeyPath:@"firstName" toAttribute:@"firstName"]; 
contactMapping.setDefaultValueForMissingAttributes = NO; 
contactMapping.primaryKeyAttribute = @"contactID"; 

// Init relationships 
[contactMapping mapRelationship:@"company" withMapping:companyMapping]; 
[contactMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"]; 

// Get objects from server 
... 

+0

¿Sería tan amable de su solución de trabajo de este ejemplo? :) Solo para las asignaciones –

+2

Actualicé mi entrada anterior con una configuración de ejemplo. ¡Espero eso ayude! – flashfabrixx

Respuesta

12

Sí, RestKit puede hidratar esta relación para que en el momento de mapeo.En su RKManagedObjectMapping para su modelo de contacto, tendrá que hacer lo siguiente:

  • agregar una asignación relación a la sociedad dominante: [objectMapping mapRelationship:@"company" withMapping:companyMapping]
  • asignar el atributo CompanyID en su modelo de Contacto
  • Asegúrese de que tiene la primaryKeyAttribute configurado en ambas clases
  • Instruir RestKit para hidratar la relación: [objectMapping connectRelationship:@"company" withObjectForPrimaryKeyAttribute:@"companyID"];

Después RestKit tiene completó el mapeo de una carga, pasará a través de la colección e hidratará cualquier relación. El procesamiento se difiere hasta después del mapeo en caso de que la carga útil realmente cree los objetos que necesita para satisfacer las conexiones.

En la rama de desarrollo, hay un flujo de trabajo alternativo disponible para usted. A principios de esta semana, agregué soporte para hidratar una relación de muchos porque usa una serie de ID en la carga útil. Esto le permitiría enviar la lista de contactos que pertenecen a una empresa hacia abajo en la carga útil en su lugar. Puede ser más eficiente para su caso de uso.

detalles adicionales de mi mensaje a la lista de correo RestKit: http://groups.google.com/group/restkit/msg/416951f86b2862d1

+0

Gracias por su reproducción rápida, ¡funciona como un encanto! Estoy viendo el proyecto en GitHub/Google ahora, porque tu segunda idea parece ser excelente para este proyecto. – flashfabrixx

+0

¡Me salvaste el día! :) Parece que necesita una clave externa en su entidad que apunta a la entidad principal que desea hidratar. De todos modos, revisé todo tipo de documentos y ejemplos, pero no entiendo cómo funciona. ¡Esta es la mejor explicación hasta ahora sobre cómo lograr que esto funcione finalmente! – Hlung

Cuestiones relacionadas