Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Restkit complex Object Mapping, with nested object arrays, in Core Data

i am using coredata and restkit to map data.

here is the json response for getsales call

{   "success":true,
"sales" : [
            {
        "brands" :[
        {"id":"637", "name":"XYZ"},
        {"id":"638", "name":"abc"}
        ]
        "end_date" = "2011-10-14 12:00:00",
        "id" = 3794,
        "image" = "http://dummy.something.com.jpg",
        "name" = "test",
    },
       {
       "brands" =[
        {"id":"640", "name":"abc"}
        ],
        "end_date" = "2011-10-14 12:00:00",
        "id" = 3766,
        "image" = "http://dummy.something.com.jpg",
        "name" = "text2",
    },
       {
       "brands" =[
        {"id":"641", "name":"XYZ"},
        {"id":"642", "name":"abc"},
        {"id":"643", "name":"def"}
        ],
        "end_date" = "2011-11-06 12:00:00",
        "id" = 3798,
        "image" = "http://dummy.something.com.jpg",
        "name" = "test3",
    }
]
}

i have

@interface Sale : NSManagedObject{   
}
@property (nonatomic, retain) NSNumber * ID;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * endDate;
@property (nonatomic, retain) NSString * imageUrl;

@implementation Sale

@dynamic ID;
@dynamic name;
@dynamic startDate;
@dynamic endDate;
@dynamic imageUrl;

I am trying to map the response as following

- (void)getSales{
    RKObjectManager* objectManager = [RKObjectManager     objectManagerWithBaseURL:@"http://baseurl.com"];
    RKManagedObjectStore* objectStore = [RKManagedObjectStore     objectStoreWithStoreFilename:@"base.sqlite"];
objectManager.objectStore = objectStore;


RKManagedObjectMapping* saleMapping = [RKManagedObjectMapping mappingForClass:[Sale class]];
    [saleMapping mapKeyPathsToAttributes:
     @"id", @"ID",
     @"name", @"name",
     @"start_date",@"startDate",
     @"end_date", @"endDate",
     @"image", @"imageUrl",
     nil];

    saleMapping.primaryKeyAttribute = @"ID";
    [[RKObjectManager sharedManager].mappingProvider setMapping:saleMapping forKeyPath:@"sales"];

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/getSales/" objectMapping:saleMapping delegate:self];
}

essentially i have nested arrays of objects, what is the correct way to map these objects?? and what type of property should Sale class have to store the brands list??

Any help is appreciated, I already wasted too much time fixing this.

like image 910
Nilesh Ukey Avatar asked Oct 14 '11 12:10

Nilesh Ukey


1 Answers

Try adding:

[saleMapping mapKeyPath:@"brands" toRelationship:@"brands" withMapping:[BrandObject objectMapping]];

where [BrandObject objectMapping] is the mapping for BrandObject (an NSManagedObject with id and name properties).

Essentially you can use mapKeyPath:toRelationship:withMapping: to nest mappings. You'll also need to add a property to your Sale object with the type NSSet:

@property (nonatomic, retain) NSSet *brands;

Finally, in the implementation of the Sale object, add: @dynamic brands alongside the other @dynamic statements.

Hope this helps! Thanks.

like image 143
Chris Nolet Avatar answered Nov 15 '22 00:11

Chris Nolet