2011-08-07 21 views
7

Estoy tratando de mapear relaciones para el siguiente JSON con un modelo respaldado por CoreData.Relaciones anidadas a muchas con RestKit

Aquí está el 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" 
        } 
       } 
      ] 
     } 
    ] 
} 

Mis modelos CoreData la que he mapeado con las clases de OM2 RestKit.

CoreData Entities

La clase de fotos.

@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 

Ahora la parte que no estoy completamente seguro en las relaciones es:

// 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]; 

con esto que soy capaz de acceder a todos, pero el atributo comments de una foto, con este error: Comments = Relationship 'comments' fault on managed object . Tengo la sensación de que esto tiene que ver con el modelo de foto que tiene comments definido como un NSSet o estoy haciendo algo mal con el mapeo de relaciones, pero no estoy seguro.

Respuesta

7

Así resulta que el problema no era nada que ver con RestKit o el mapeo pero mi comprensión de cómo funciona CoreData.

que era el acceso a los objetos JSON mapeados en mi delgate de la siguiente manera:

- (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); 
    } 
} 

El problema estaba en tratar de imprimir directamente el objeto de colección. CoreData no generaría un error en el almacén de datos. Simplemente reemplazar con una iteración rápida de la siguiente manera y acceder a las propiedades me permitió acceder al objeto de comentarios.

for (Photo *photo in objects) { 
    for (Comment *comment in photo.comments) NSLog(@"Comment = %@", comment.text); 
} 
+0

me has salvado, muchas gracias! –

Cuestiones relacionadas