objective c - Restkit object mapping gives null objects -
i have entity (on core data
) called contact
, each contact has neighborhood
, user
, contactorigin
entities related it. when retrive json data server, this:
{ "contact" : [ { "prospect" : { "pkprospect" : 21, "name" : "test contact", "email" : "test@domain.com", "phone" : "5555555555", "address" : "test avenue", "media" : { "pkmedia" : 3, "name" : "referência entrevista move" }, "neighborhood" : { "pkneighborhood" : 15857, "name" : "donwtown" } }, "user" : { "firstname" : "john", "pkperson" : 5, "lastname" : "doe" } } ] }
so can see, have array of contacts , each contact has user node, neighborhood node , media node (which use origin on database). restkit seems mapping right way code:
// getting object manager. rkobjectmanager *objectmanager = [rkobjectmanager sharedmanager]; // relationship mappings. rkmanagedobjectmapping *neighborhoodmapping = [rkmanagedobjectmapping mappingforclass:[neighborhood class] inmanagedobjectstore:objectmanager.objectstore]; neighborhoodmapping.primarykeyattribute = @"identifier"; [neighborhoodmapping mapkeypath:@"pkneighborhood" toattribute:@"identifier"]; rkmanagedobjectmapping *originmapping = [rkmanagedobjectmapping mappingforclass:[contactorigin class] inmanagedobjectstore:objectmanager.objectstore]; originmapping.primarykeyattribute = @"identifier"; [originmapping mapkeypath:@"pkmedia" toattribute:@"identifier"]; rkmanagedobjectmapping *usermapping = [rkmanagedobjectmapping mappingforclass:[user class] inmanagedobjectstore:objectmanager.objectstore]; usermapping.primarykeyattribute = @"identifier"; [usermapping mapkeypath:@"pkperson" toattribute:@"identifier"]; // creating contact mapping request. rkmanagedobjectmapping *contactmapping = [rkmanagedobjectmapping mappingforclass:[contact class] inmanagedobjectstore:objectmanager.objectstore]; contactmapping.primarykeyattribute = kcontactfieldnameid; [contactmapping mapkeypath:@"prospect.neighborhood" torelationship:@"addressneighborhood" withmapping:neighborhoodmapping]; [contactmapping mapkeypath:@"prospect.media" torelationship:@"origin" withmapping:originmapping]; [contactmapping mapkeypath:@"user" torelationship:@"user" withmapping:usermapping]; [contactmapping connectrelationship:@"addressneighborhood" withobjectforprimarykeyattribute:@"identifier"]; [contactmapping connectrelationship:@"origin" withobjectforprimarykeyattribute:@"identifier"]; [contactmapping connectrelationship:@"user" withobjectforprimarykeyattribute:@"identifier"]; [contactmapping mapkeypath:@"prospect.pkprospect" toattribute:@"identifier"]; [contactmapping mapkeypath:@"prospect.name" toattribute:@"name"]; [contactmapping mapkeypath:@"prospect.email" toattribute:@"email"]; [contactmapping mapkeypath:@"prospect.phone" toattribute:@"phone"]; [contactmapping mapkeypath:@"prospect.address" toattribute:@"address"]; // setting result mapping. [objectmanager.mappingprovider setobjectmapping:contactmapping forkeypath:@"contact"]; // loading data. [objectmanager loadobjectsatresourcepath:resourcepath usingblock:^(rkobjectloader *loader) { loader.delegate = self; loader.userdata = delegate; }];
when mapping complete, receive following message (i'm showing user
error):
2012-07-06 18:20:23.016 contact manager[8254:10c03] e restkit.core_data:rkmanagedobjectstore.m:250 core data save error nslocalizeddescription: operation couldnât completed. (cocoa error 1570.) nsvalidationerrorkey: user nsvalidationerrorpredicate: (null) nsvalidationerrorobject: <contact: 0x917dff0> (entity: contact; id: 0x917e070 <x-coredata:///contact/t9d9ee4ae-142a-45ec-88c1-e97833729d0c2> ; data: { address = "test avenue"; addressneighborhood = "0x918b5b0 <x-coredata://6e5ab6f3-aff4-460e-a37d-285a105178f0/neighborhood/p21>"; email = "test@domain.com"; identifier = 21; name = "test contact"; origin = nil; phone = 5555555555; user = nil; }) 2012-07-06 18:20:23.024 contact manager[8254:10c03] e restkit.core_data:rkmanagedobjectloader.m:167 failed save managed object context after mapping completed: operation couldnât completed. (cocoa error 1560.)
as can see, both origin
, user
null , causing error when try save on core data
because fields required, if take @ logs restkit we'll see objects have been parsed correctly , in fact exists in database.
2012-07-06 18:20:22.938 contact manager[8254:10c03] d restkit.object_mapping:rkobjectmappingoperation.m:636 starting mapping operation... 2012-07-06 18:20:22.940 contact manager[8254:10c03] t restkit.object_mapping:rkobjectmappingoperation.m:637 performing mapping operation: rkobjectmappingoperation 'user' object. mapping values object { firstname = john; lastname = doe; pkperson = 5; } object <user: 0x5ca9d60> (entity: user; id: 0xc5aa7a0 <x-coredata://6e5ab6f3-aff4-460e-a37d-285a105178f0/user/p1> ; data: { contacts = "<relationship fault: 0xc5ab580 'contacts'>"; email = "john@domain.com"; identifier = 5; ip = "0.0.0.0"; isloggedin = 1; language = "en"; name = "john doe"; password = 4badaee57fed5610012a296273158f5f; }) object mapping <rkmanagedobjectmapping:0x5ca78b0 objectclass=user keypath mappings => ( "rkobjectkeypathmapping: pkperson => identifier" )> 2012-07-06 18:20:22.942 contact manager[8254:10c03] t restkit.object_mapping:rkobjectmappingoperation.m:330 mapping attribute value keypath 'pkperson' 'identifier' 2012-07-06 18:20:22.943 contact manager[8254:10c03] d restkit.object_mapping:rkobjectpropertyinspector.m:107 cached property names , types class 'user': { accessibilityhint = nsstring; accessibilitylabel = nsstring; accessibilitylanguage = nsstring; accessibilityvalue = nsstring; contacts = nsset; email = nsstring; identifier = nsnumber; ip = nsstring; isloggedin = nsnumber; language = nsstring; name = nsstring; password = nsstring; } 2012-07-06 18:20:22.944 contact manager[8254:10c03] t restkit.object_mapping:rkobjectmappingoperation.m:347 skipped mapping of attribute value keypath 'pkperson keypath 'identifier' -- value unchanged (5) 2012-07-06 18:20:22.946 contact manager[8254:10c03] d restkit.object_mapping:rkobjectmappingoperation.m:643 finished mapping operation successfully... 2012-07-06 18:20:22.966 contact manager[8254:10c03] t restkit.object_mapping:rkobjectmappingoperation.m:597 mapped relationship object keypath 'user' 'user'. value: <user: 0x5ca9d60> (entity: user; id: 0xc5aa7a0 <x-coredata://6e5ab6f3-aff4-460e-a37d-285a105178f0/user/p1> ; data: { contacts = "<relationship fault: 0xc5ab580 'contacts'>"; email = "john@domain.com"; identifier = 5; ip = "0.0.0.0"; isloggedin = 1; language = "pt_br"; name = "john doe"; password = 4badaee57fed5610012a296273158f5f; }) 2012-07-06 18:20:22.968 contact manager[8254:10c03] d restkit.object_mapping:rkobjectmappingoperation.m:643 finished mapping operation successfully...
so, question here why user
, origin
null if parser found objects database? there wrong mapping?
after lot of debugging found way fix it. first, fact using same primary key (@"identifier"
) every object, messing mapping.
after that, i've removed [contactmapping connectrelationship:withobjectforprimarykeyattribute:]
because it's not needed , seems working.
Comments
Post a Comment