2012-04-29 46 views
12

Có thể RestKit kết nối một mối quan hệ mà không lưu trữ khóa ngoại như một thuộc tính, tức là trực tiếp từ đường phím trong JSON?Đối tượng RestKit Ánh xạ các mối quan hệ với các khóa ngoài

Đặc biệt, tôi đã có mối quan hệ công việc với has_many Rooms. JSON của phòng không chứa công việc, thay vào đó, cả hai đều được tải riêng:

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

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

Công việc được tải trước phòng.

mô hình CoreData tôi, công việc có tính chất cho

@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 

Hiện nay tôi thêm một @property (nonatomic, strong) NSNumber *jobID; vào phòng, mà tôi @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"]; 

Tôi đã tự hỏi liệu có cách nào tôi có thể thực hiện việc này mà không có thuộc tính jobID bổ sung không? Tôi không muốn có một thuộc tính jobID trong CoreData xcdatamodeld - nó thừa, vì mối quan hệ bao gồm điều đó.

Ngoài ra nếu tôi xây dựng lại NSManagedObjects, tôi cần phải thêm lại thuộc tính jobID, quá tẻ nhạt. Tôi không thể nói với Restkit để kết nối Room với Job tương ứng của nó thông qua keypath job_id trong JSON?

Nếu tôi loại bỏ các tài sản, mapKeyPath:@"job_id" dòng, và thay đổi dòng cuối cùng để [mapping connectRelationship:@"job" withObjectForPrimaryKeyAttribute:@"job_id"]; tôi nhận được

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

Bạn đã tìm hiểu cách kết nối đúng đắn mối quan hệ trong Dữ liệu cốt lõi mà không cần có thuộc tính ID dự phòng bên cạnh mối quan hệ thực sự? – thejaz

Trả lời

5

tôi sẽ làm JobId một giá trị tạm thời trong dữ liệu cốt lõi, và viết một thiết lập tùy chỉnh và có được cho nó .

Bộ sẽ thiết lập các mối quan hệ để self.job = methodToReturnObjectMatchingJobId (điều này sẽ được sử dụng bởi bộ phần còn lại)

Các get sẽ trở self.job.identifier

Nếu bạn không sử dụng mogenerator , Tôi khuyên bạn nên xem xét nó cho tất cả các nhu cầu dữ liệu cốt lõi của bạn.

Dưới đây là mẫu mã như thế nào tôi đã làm nó:

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

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

    return self.claim.referenceId; 
} 

nơi listItemFromId là một truy vấn đơn giản mà trả về đối tượng dựa vào định danh.

+0

Điều này không làm cho bản đồ mối quan hệ của Restkit trở nên dư thừa? Tôi có nên vô hiệu hóa bản đồ của Restkit hoặc có thể để trống setClaimId không? – geon

+0

Điều tôi đang làm là sử dụng ánh xạ hoặc claimId và sử dụng để thiết lập mối quan hệ với đối tượng yêu cầu bên ngoài restKit. Vì vậy, bạn sẽ không có một ánh xạ trong restKit cho mối quan hệ trong trường hợp này (nếu đây là cách bạn đang làm nó). –

Các vấn đề liên quan