RestKit对象与外键的映射关系

问题描述:

RestKit可以连接关系而不将外键存储为属性,即直接来自JSON中的键路径?RestKit对象与外键的映射关系

特别是,我有一个工作has_many房关系。房间的JSON不包含作业,而是两者分别加载:

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

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

作业在房间之前加载。

我CoreData模型,工作有

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

我在想,如果有一种方法,我可以做到这一点没有额外的作业ID属性?我不想在CoreData xcdatamodeld中有一个jobID属性 - 它是多余的,因为关系覆盖了这个属性。

此外,如果我重建NSManagedObjects,我需要重新添加jobID属性,这是乏味的。我不能通过JSON中的job_id keypath来告诉restkit将Room连接到相应的Job吗?

如果我删除的特性,mapKeyPath:@"job_id"线,并更改最后一行[mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"];我得到

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

您是否已经发现如何正确连接核心数据中的关系,而没有在真实关系旁边具有冗余ID属性? – thejaz 2013-05-24 14:24:32

我会做的JobId核心数据的瞬时值,并编写自定义设置和获取它。

的集将设置关系self.job = methodToReturnObjectMatchingJobId(这可以由其他套件配合使用)

如果你不使用mogenerator的get将返回self.job.identifier

,我建议你看看它的所有核心数据需求。

下面是我是如何做到的示例代码:

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

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

    return self.claim.referenceId; 
} 

其中listItemFromId是一个简单的查询,返回基于该ID的对象。

+0

这不会使Restkit的关系映射变得多余吗?我应该禁用Restkit的映射,还是让setClaimId保持空白? – geon 2013-03-08 10:54:49

+0

我正在做的是使用映射或claimId并使用它将关系设置为在restKit之外声明对象。因此,在这种情况下,您不会在restKit中为关系创建映射(如果这是您的工作方式)。 – 2013-03-10 13:25:39