2012-04-29 11 views
12

Kann RestKit eine Beziehung verbinden, ohne den Fremdschlüssel als Attribut zu speichern, d. H. Direkt vom Schlüsselpfad im JSON?RestKit Object Zuordnung von Beziehungen mit Fremdschlüsseln

Insbesondere habe ich eine Job has_many Rooms Beziehung. Das JSON Zimmer nicht den Job enthält, vielmehr sind beide separat geladen:

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

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

Der Job wird vor dem Raum geladen.

Meine Coredata-Modelle, hat Job Eigenschaften für

@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 

Zur Zeit füge ich ein @property (nonatomic, strong) NSNumber *jobID; zu Zimmer, das ich @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"]; 

ich mich gefragt, ob es einen Weg gibt ich dies ohne die zusätzliche jobID Eigenschaft tun? Ich möchte kein JobID-Attribut im CoreData xcdatamodel haben - es ist redundant, da die Beziehung das abdeckt.

Auch wenn ich die NSManagedObjects neu erstellen, muss ich die JobID-Eigenschaft neu hinzufügen, was mühsam ist. Kann ich Restkit nicht mitteilen, dass der Raum über den Schlüsselpfad job_id im JSON mit dem entsprechenden Job verbunden werden soll?

Wenn ich die Eigenschaft entfernen, die mapKeyPath:@"job_id" Linie, und ändern Sie die letzte Zeile zu [mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"]; ich

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

Haben Sie herausgefunden, wie Sie die Beziehung in Core Data richtig verbinden können, ohne eine redundante ID-Eigenschaft neben der echten Beziehung zu haben? – thejaz

Antwort

5

Ich würde JobId in Kerndaten einen vorübergehenden Wert machen, und schreiben Sie eine benutzerdefinierte gesetzt und dafür bekommen .

Der Satz würde die Beziehung gesetzt = methodToReturnObjectMatchingJobId (dies wird durch Rest-Kit verwendet werden würde) self.job

Die get zurückkehren würde self.job.identifier

Wenn Sie mogenerator nicht verwenden Ich würde vorschlagen, dass Sie einen Blick auf all Ihre Kerndaten haben.

Unten finden Sie Beispielcode, wie ich es tat:

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

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

    return self.claim.referenceId; 
} 

wo listItemFromId eine einfache Abfrage, die das Objekt auf der id basiert zurückgibt.

+0

Macht dies nicht die Beziehungskartierung von Restkit überflüssig? Soll ich die Zuordnung von Restkit deaktivieren oder vielleicht setClaimId leer lassen? – geon

+0

Was ich tue, ist das Mapping oder claimId und damit die Beziehung zum Claim-Objekt außerhalb von RestKit zu setzen. Sie hätten also in RestKit kein Mapping für die Beziehung in diesem Fall (wenn Sie es so machen). –

Verwandte Themen