I\'m having trouble migrating a store entity attribute from String to Integer 16. Here are the steps I take:
This happens because Core Data is unable to automatically migrate your attribute. This is because it can't guarantee that a string will always fit in an int (even though you know your data does).
So what you need to do is use a mapping model. Here's how to do it:
createDestinationInstancesForSourceInstance:entityMapping:manager:error:
which will give you the source instance so you can convert that string into an int and store it in the new store.Your code should look something like this:
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];
// Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute:
[newObject setValue:[sInstance valueForKey:@"xyz"] forKey:@"xyz"];
[manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
}
Be sure to change the migration settings to remove automatic type inference wherever you init Core Data
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
That should be it...