Michaela
Michaela

Reputation: 493

RestKit/CoreData not updating - creating duplicates

I have an ios 5 app which does not create any data - it simply makes a GET call to a REST webservice and populates the sqlite database with those records. The initial GET works great when there are no records in the local database. However when I make subsequent calls, I will only be returning a subset of records whose data has changed since the last GET. But what is happening is that the records are just being added again, not updating the existing records.

I have an ID field which is the primary key (or should be) and when a record comes in whose ID already exists, I want that data to be updated. If that ID does not exist, it should be an insert.

I didn't see a way to set my ID field as a 'primary key' in the datamodel in XCode. I tried doing this in my didFinishLaunchingWIthOptions method:

userMapping.primaryKeyAttribute = @"id";

But that alone didn't really seem to do anything.

This is my call to actually perform the GET:

 // Load the object model via RestKit   
[objectManager loadObjectsAtResourcePath:[@"/synchContacts" appendQueryParams:params] delegate:self];

Which seems to do everything automagically. I am lost at this point as to where I should be putting logic to check to see if the ID exists, and if so do an update vs an insert, or what.

Upvotes: 3

Views: 973

Answers (3)

electronix384128
electronix384128

Reputation: 6733

As of the latest RESTKit version (0.23) you can define the primary key like this:

[_mapping addAttributeMappingsFromDictionary:@{ @"id" : @"objectId", @"name" : @"name" }];
[_mapping setIdentificationAttributes:@[ @"objectId" ]];

Whereas objectId is you primary key on the core data object.

Upvotes: 1

nine stones
nine stones

Reputation: 3438

Quote: I didn't see a way to set my ID field as a 'primary key' in the datamodel in XCode. I tried doing this in my didFinishLaunchingWIthOptions method: userMapping.primaryKeyAttribute = @"id";

Keep in mind, the 'primaryKeyAttribute' is the one from your api payload, NOT a CoreData id, which CoreData manages on its own. RestKIt then maps the (invisible) CoreData primary key to the specified JSON key.

Upvotes: 0

Patrick Tescher
Patrick Tescher

Reputation: 3447

You seem to be doing it correctly and when your didLoadObjects callback happens you should be able to query Core Data for the objects you need.

You might be having an issue with the way your fetch requests are being set up. With the latest RestKit you can use RKObjectMappingProvider's

- (void)setObjectMapping:(RKObjectMappingDefinition *)objectMapping forResourcePathPattern:(NSString *)resourcePathPattern withFetchRequestBlock:(RKObjectMappingProviderFetchRequestBlock)fetchRequestBlock;

function and have the fetchRequestBlock fetch the proper data.

RestKit doesn't really handle partial update requests very well out of the box though. You might have more luck on the RestKit google group which is very active.

Upvotes: 0

Related Questions