Вложенные-многие отношения с RestKit - PullRequest
7 голосов
/ 07 августа 2011

Я пытаюсь сопоставить отношения для следующего JSON с моделью на основе CoreData.

Вот JSON:

{
    "photos": [
        {
            "id": 1,
            "thumb": "http://localhost/test_1_thumb.png",
            "image": "http://localhost/test_1.png",
            "date": "2011-07-02T06:06:16Z",
            "likes": 0,
            "user": {
                "id": 1,
                "username": "User1",
                "avatar": "http://cdn.domain.com/avatar.jpg"
            },
            "comments": [
                {
                    "date": "2011-07-02T06:06:16Z",
                    "text": "This is the only comment",
                    "id": 1,
                    "author": {
                        "username": "User1",
                        "id": 1,
                        "avatar": "http://cdn.domain.com/avatar.jpg"
                    }
                }
            ]
        }
    ]
}

Мои модели CoreData, которые я сопоставил с классами Rest2it OM2.

CoreData Entities

Фото-класс.

@interface Photo : NSManagedObject

@property (nonatomic, retain) NSString * thumbnailUrl;
@property (nonatomic, retain) NSString * imageUrl;
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSNumber * likes;
@property (nonatomic, retain) NSNumber * photoID;
@property (nonatomic, retain) User *owner;
@property (nonatomic, retain) NSSet *comments;

@end

@interface Photo (CoreDataGeneratedAccessors)

- (void)addCommentsObject:(Comment *)value;
- (void)removeCommentsObject:(Comment *)value;
- (void)addComments:(NSSet *)values;
- (void)removeComments:(NSSet *)values;

@end

@implementation Photo

@dynamic thumbnailUrl;
@dynamic imageUrl;
@dynamic date;
@dynamic likes;
@dynamic photoID;
@dynamic owner;
@dynamic comments;

@end

Теперь часть, в которой я не совсем уверен, это отношения:

// Map relationships between entities.
[commentMapping mapKeyPath:@"author" toRelationship:@"author" withMapping:userMapping];
[photoMapping mapKeyPath:@"user" toRelationship:@"owner" withMapping:userMapping];
[photoMapping mapKeyPath:@"comments" toRelationship:@"comments" withMapping:commentMapping];

Благодаря этому я могу получить доступ ко всем атрибутам фотографии, кроме comments, с этой ошибкой: Comments = Relationship 'comments' fault on managed object. У меня такое чувство, что это связано с моделью Photo, в которой comments определен как NSSet, или я делаю что-то не так с отображением отношений, но я не уверен.

Ответы [ 2 ]

7 голосов
/ 10 августа 2011

Получается, что проблема заключалась не в RestKit или в отображении, а в том, как я понимаю, как работает CoreData.

Я обращался к сопоставленным объектам JSON в моем delgate следующим образом:

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
    NSLog(@"Loaded photos: %@", objects);

    for (id object in objects) {
        Photo *photo = object;
        // Print other photo attributes...

        NSLog(@"Comments = %@", photo.comments );
    }
}

Проблема была в том, что мы пытались напечатать объект коллекции напрямую. CoreData не будет вызывать ошибку в хранилище данных. Простая замена на быструю итерацию, как описано ниже, и доступ к свойствам позволили мне получить доступ к объекту комментариев.

for (Photo *photo in objects) {
    for (Comment *comment in photo.comments) NSLog(@"Comment = %@", comment.text);
}
2 голосов
/ 09 августа 2011

Вам нужно что-то вроде:

[objectManager.mappingProvider setMapping: commentMapping forKeyPath: @ "comments"];

Также оформить заказ https://github.com/RestKit/RestKit/wiki/Object-mapping

...