2012-04-29 12 views
12

Puede RestKit conectar una relación sin almacenar la clave externa como un atributo, es decir, directamente de la ruta de acceso clave en el JSON?RestKit relaciones de mapeo de objetos con claves externas

En particular, tengo una relación has_many habitaciones de empleo. JSON de la habitación no contiene el trabajo, más bien, ambas se cargan por separado:

- job: { 
    id: 1, 
    name: "John" 
} 

- room: { 
    id: 4, 
    job_id: 1, 
    name: "spare bedroom" 
} 

El empleo se carga antes de la habitación.

Mis modelos CoreData, Job tiene propiedades para

@interface Job : NSManagedObject 
@property (nonatomic, retain) NSNumber * identifier; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSSet *rooms; 
@end 

@interface Room : NSManagedObject 
@property (nonatomic, retain) NSNumber * identifier; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) Job *job; 
@end 

Actualmente agrego un @property (nonatomic, strong) NSNumber *jobID; la habitación, que me @synthesize.

JobMapping: 
    mapping = [RKManagedObjectMapping mappingForClass:[Job class]]; 
    [mapping setPrimaryKeyAttribute:@"identifier"]; 

    [mapping mapAttributes:@"name", nil]; 
    [mapping mapKeyPath:@"id" toAttribute:@"identifier"]; 

    [mapping mapRelationship:@"rooms" withMapping:[Room objectMapping]]; 



RoomMapping 
    mapping = [RKManagedObjectMapping mappingForClass:[Room class]]; 
    [mapping setPrimaryKeyAttribute:@"identifier"]; 

    [mapping mapAttributes:@"name", nil]; 
    [mapping mapKeyPath:@"id" toAttribute:@"identifier"]; 
    [mapping mapKeyPath:@"job_id" toAttribute:@"jobID"]; 

    [mapping mapRelationship:@"job" withMapping:[Job objectMapping]]; 

    [mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"jobID"]; 

Me preguntaba si hay alguna manera de hacer esto sin la propiedad de la Id adicional? No quiero tener un atributo jobID en el CoreData xcdatamodeld; es redundante, ya que la relación lo cubre.

Además, si uno vuelve a edificar las NSManagedObjects, tengo que volver a añadir la propiedad de la Id, que es tedioso. ¿No puedo decirle a restkit que conecte la sala a su trabajo correspondiente a través del key_key job_id en el JSON?

Si quito la propiedad, la línea mapKeyPath:@"job_id", y cambiar la última línea de [mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"]; consigo

the entity Room is not key value coding-compliant for the key "job_id". 
+0

¿Ha encontrado la manera de conectar correctamente la relación de datos básicos sin tener una propiedad ID redundante junto a la relación real? – thejaz

Respuesta

5

me gustaría hacer jobid un valor transitorio de datos básicos, y escribir un conjunto personalizado y obtener por él .

El conjunto establecería la relación a = self.job methodToReturnObjectMatchingJobId (esto sería utilizado por el kit de descanso)

The Get volvería self.job.identifier

Si no está utilizando mogenerator , Le sugiero que lo revise para todas sus necesidades básicas de datos.

A continuación se muestra el código de ejemplo de cómo lo hice:

-(void) setClaimId:(NSNumber *)claimId{ 
    Claim *propertyClaim=[Claim listItemFromId:[claimId intValue] withContext:self.managedObjectContext]; 

    self.claim=propertyClaim; 
} 
-(NSNumber*) claimId{ 

    return self.claim.referenceId; 
} 

donde listItemFromId es una simple consulta que devuelve el objeto basado en el id.

+0

¿Esto no hace que el mapeo de relaciones de Restkit sea redundante? ¿Debería deshabilitar el mapeo de Restkit, o quizás dejar setClaimId en blanco? – geon

+0

Lo que estoy haciendo es usar la asignación o claimId y usar eso para establecer la relación con el objeto de reclamo fuera de restKit. Entonces no tendrías un mapeo en restKit para la relación en este caso (si así es como lo estás haciendo). –

Cuestiones relacionadas