2

iOSアプリケーションでRestKit0.20を使用してjsonをコアデータオブジェクトにマッピングしようとしています。ユーザーとメッセージの2種類のオブジェクトがあります。ユーザーには多くのメッセージがあります。メッセージにはフィールドがあります:「from」および「to」はユーザーを指します。これが私のメッセージjsonです:

[
    {
        "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では、フィールド「to」と「from」がネストされたオブジェクトではなくユーザーのIDであるため、アプリケーションがクラッシュすることです。

同様のSOの質問を見つけましたが、それでも機能させることができません。

Objective-Cを使用したXcodeのRestKitでネストされたIDのマッピング

IDの配列を介したRestKitの関係のマッピングが機能しない

誰かがマッピングを正しく設定するのを手伝ってくれるでしょうか?jsonにはユーザーのIDのみが含まれ、ネストされたオブジェクトは含まれませんか?

4

1 に答える 1

1

わかりました。API ドキュメントには、この種の関係をマッピングする方法の例が示されています: http://restkit.org/api/latest/Classes/RKConnectionDescription.html

フィールド「from」と「to」をダミーの「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];
于 2013-01-17T09:31:23.720 に答える