12

RestKitは、外部キーを属性として保存せずに、つまりJSONのキーパスから直接関係を接続できますか?

特に、私はJobhas_manyRoomsの関係を持っています。部屋のJSONにはジョブが含まれていません。むしろ、両方が別々にロードされます。

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

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

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

私のCoreDataモデル、Jobには次のプロパティがあります

@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

@property (nonatomic, strong) NSNumber *jobID;現在、私は部屋にを追加してい@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"];

追加のjobIDプロパティなしでこれを実行できる方法があるかどうか疑問に思っていましたか? CoreData xcdatamodeldにjobID属性を含めたくありません。関係がそれをカバーしているため、冗長です。

また、NSManagedObjectsを再構築する場合は、jobIDプロパティを再度追加する必要があります。これは面倒です。JSONのjob_idキーパスを介してRoomを対応するジョブに接続するようにrestkitに指示することはできませんか?

プロパティと行を削除しmapKeyPath:@"job_id"、最後の行を[mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"];次のように変更すると、

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

1 に答える 1

5

JobIdをコアデータの一時的な値にし、カスタムセットを作成して取得します。

セットは、関係をself.job = methodToReturnObjectMatchingJobIdに設定します(これはRESTキットで使用されます)

getはself.job.identifierを返します

mogeneratorを使用していない場合は、コアデータのすべてのニーズについてmogeneratorを確認することをお勧めします。

以下は私がそれをした方法のサンプルコードです:

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

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

  return self.claim.referenceId;
}

ここで、listItemFromIdは、IDに基づいてオブジェクトを返す単純なクエリです。

于 2012-05-01T15:31:22.913 に答える