2012-04-29 123 views
12

RestKitは外部キーを属性として(つまりJSONのキーパスから直接)格納せずにリレーションシップを接続できますか?RestKitオブジェクト外部キーとの関係

特に、私は仕事has_manyルーム関係を持っています。部屋のJSONにはジョブが含まれず、別々にロードされます。

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

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

ジョブはルームの前にロードされます。

私のCoreDataのモデルは、仕事は現在、私は部屋に@property (nonatomic, strong) NSNumber *jobID;、I @synthesizeを追加

@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 

のプロパティを持っています。

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"]; 

私は余分なジョブIDプロパティせずにこれを行うことができる方法があるのか​​と思いまして?私はCoreData xcdatamodeldにjobID属性を持たせたくありません。それは関係がそれをカバーするので、冗長です。

また、NSManagedObjectsを再構築する場合は、退屈なjobIDプロパティを再追加する必要があります。 JSONのjob_idキーパスを使ってルームをその対応するジョブに接続するようにRestkitに指示することはできませんか?

私は、mapKeyPath:@"job_id"ラインをプロパティを削除し、[mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"];に最後の行を変更した場合、私は私がのJobIdコアデータの一過性の値にすると、カスタムセットを書いて、それのためになるだろう

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

本当の関係の隣に冗長なIDプロパティを持たずに、コアデータの関係を正しく接続する方法を知りましたか? – thejaz

答えて

5

を取得。

セットは、あなたがmogeneratorを使用していない場合

GETはself.job.identifier

を返します(これは、残りのキットで使用される)= methodToReturnObjectMatchingJobIdをself.jobする関係を設定します、私はあなたのすべてのあなたのコアデータのニーズを見てお勧めします。

以下は、私はそれをやったかのサンプルコードです:listItemFromIdは、IDに基づいてオブジェクトを返す単純なクエリである

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

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

    return self.claim.referenceId; 
} 

+0

これはRestkitのリレーションシップマッピングを冗長にしませんか? Restkitのマッピングを無効にするか、setClaimIdを空白にしておくべきですか? – geon

+0

私がやっているのは、マッピングやclaimIdを使って、restKitの外でオブジェクトを要求する関係を設定することです。したがって、このケースでは、restKitにマッピングを持たないでしょう(これがあなたのやり方である場合)。 –

関連する問題