2013-01-16 52 views
2

我想在我的iOS應用程序映射JSON與RestKit 0.20核心數據對象的映射。 我有兩種類型的對象:用戶和消息。用戶有很多消息。消息包含指向用戶的字段'from'和'to'。 這裏是我的消息JSON:Restkit - 只有子ID

[ 
    { 
     "created_at":1358265482867, 
     "to":"50ed7b4e63e9b80200000009", 
     "note":"Hello", 
     "from":"50ee98365315d00200000003", 
     "_id":"50f57cee11f2b00200000016", 
     "__v":0 
    }, 
    { 
     "created_at":1358265582867, 
     "to":"50ed7b4e63e9b80200000009", 
     "note":"Hello 2", 
     "from":"50ee98365315d00200000003", 
     "_id":"50f57cee11f2b00200000016", 
     "__v":0 
    } 
] 

我的映射代碼如下所示:

// Object mappings 
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore]; 
userMapping.identificationAttributes = @[@"userId"]; 
[userMapping addAttributeMappingsFromDictionary:@{ 
    @"_id": @"userId", 
    @"name": @"name", 
    @"note": @"headline", 
    @"photo_url": @"photoUrl" 
}]; 

RKEntityMapping *messageMapping = [RKEntityMapping mappingForEntityForName:@"Message" inManagedObjectStore:managedObjectStore]; 
messageMapping.identificationAttributes = @[@"messageId"]; 
[messageMapping addAttributeMappingsFromDictionary:@{ 
    @"_id": @"messageId", 
    @"note": @"note", 
    @"created_at": @"createdAt", 
    @"from": @"from", 
    @"to" : @"to" 
}]; 

// !!! This code is ok if json contains entire object (but contains only id). 
// [messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"from" toKeyPath:@"from" withMapping:userMapping]]; 
// [messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"to" toKeyPath:@"to" withMapping:userMapping]]; 

RKEntityMapping *messageReversedMapping = [messageMapping inverseMapping]; 
RKRequestDescriptor *requestDescription = [RKRequestDescriptor requestDescriptorWithMapping:messageReversedMapping objectClass:[Message class] rootKeyPath:nil]; 
[objectManager addRequestDescriptor:requestDescription]; 

RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:userMapping pathPattern:@"/users" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:userResponseDescriptor]; 

RKResponseDescriptor *messageResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:messageMapping pathPattern:@"/messages" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:messageResponseDescriptor]; 

型號代碼:

@interface Message : NSManagedObject 

@property (nonatomic, retain) NSString * note; 
@property (nonatomic, retain) NSNumber * createdAt; 
@property (nonatomic, retain) NSString * messageId; 
@property (nonatomic, retain) User *from; 
@property (nonatomic, retain) User *to; 


@interface User : NSManagedObject 

@property (nonatomic, retain) NSString * email; 
@property (nonatomic, retain) NSString * headline; 
@property (nonatomic, retain) NSString * lastName; 
@property (nonatomic, retain) NSNumber * me; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * photoUrl; 
@property (nonatomic, retain) NSString * userId; 
@property (nonatomic, retain) Message *messagesFrom; 
@property (nonatomic, retain) Message *messagesTo; 

的問題是,在JSON,領域 「到」 和「從「是用戶的ID而不是嵌套的對象,所以應用程序崩潰。

我已經發現了類似的做題,但仍然不能使它發揮作用。

Mapping nested IDs with RestKit in Xcode using Objective-C

Mapping relationships in RestKit through an array of IDs doesn't work

誰能幫我設置映射正確,那麼JSON將只包含用戶的ID和不嵌套的對象嗎?

回答

1

好,我想通了。 API文檔給出了一個例子,如何映射這種關係: http://restkit.org/api/latest/Classes/RKConnectionDescription.html

我仍然需要「從」映射字段和「到」以假人fromUserId'和「toUserId」,但它的工作原理。

此代碼的工作對我來說:

NSManagedObjectContext *context = ApplicationDelegate.managedObjectContext; 
NSEntityDescription *messageEntity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:context]; 
NSRelationshipDescription *userRelationshipFrom = [messageEntity relationshipsByName][@"from"]; 
RKConnectionDescription *connectionUserMessageFrom = [[RKConnectionDescription alloc] initWithRelationship:userRelationshipFrom attributes:@{ @"fromUserId": @"userId" }]; 
[messageMapping addConnection:connectionUserMessageFrom]; 

NSRelationshipDescription *userRelationshipTo = [messageEntity relationshipsByName][@"to"]; 
RKConnectionDescription *connectionUserMessageTo = [[RKConnectionDescription alloc] initWithRelationship:userRelationshipTo attributes:@{ @"toUserId": @"userId" }]; 
[messageMapping addConnection:connectionUserMessageTo];