2012-04-29 14 views
12

Czy RestKit może łączyć relację bez zapisywania klucza obcego jako atrybutu, tj. Bezpośrednio z keypath w JSON?RestKit Object Relacje mapujące z kluczami obcymi

W szczególności mam związek Job ma wiele pokoi. JSON pomieszczenia nie zawiera zadania, ale oba są ładowane osobno:

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

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

Praca jest ładowana przed salą.

Moi CoreData modele Job ma właściwości

@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 

Obecnie dodaję @property (nonatomic, strong) NSNumber *jobID; do pokoju, który ja @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"]; 

Zastanawiałem się, czy istnieje sposób mogę to zrobić bez dodatkowych własności jobid? Nie chcę mieć atrybut jobID w CoreData xcdatamodeld - jest zbędny, ponieważ relacja obejmuje to.

Również jeśli odbuduję obiekty NSManagedObjects, muszę ponownie dodać właściwość jobID, co jest uciążliwe. Czy nie mogę nakazać restkitowi połączenia pokoju z odpowiadającym mu zadaniem za pośrednictwem keypath job_id w JSON?

Jeśli usunąć właściwość, linię mapKeyPath:@"job_id" i zmień ostatnią linię do [mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"]; uzyskać

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

Czy dowiedziałeś się, jak prawidłowo połączyć relację w danych podstawowych bez posiadania właściwości redundantnej obok rzeczywistej relacji? – thejaz

Odpowiedz

5

chciałbym zrobić jobid przemijające wartości w danych podstawowych i napisać niestandardowy zestaw i uzyskać dla niego .

Zestaw byłoby ustawić relację do self.job = methodToReturnObjectMatchingJobId (miałoby to być wykorzystywane przez zestaw spoczynku)

get wróci self.job.identifier

Jeśli nie używasz mogenerator , Chciałbym zasugerować, abyś spojrzał na to dla wszystkich swoich podstawowych potrzeb danych.

Poniżej przykładowy kod jak to zrobiłem:

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

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

    return self.claim.referenceId; 
} 

gdzie listItemFromId jest prostą kwerendę, która zwraca obiekt w oparciu o id.

+0

Czy to nie powoduje, że mapowanie relacji w Restkit jest nadmiarowe? Czy powinienem wyłączyć mapowanie Restkit, czy może pozostawić puste pole setClaimId? – geon

+0

To, co robię, to użycie odwzorowania lub claimId i użycie go do ustawienia relacji do żądania obiektu poza restKit. Więc nie będziesz miał mapowania w restKit dla relacji w tym przypadku (jeśli tak to robisz). –

Powiązane problemy