Why migration required ?
When the model does not match the store, a migration is required. In order to perform a migration, Core Data (technically, an instance of NSMigrationManager) requires these things:
- The destination managed object model (the one with the changes)
- A managed object model that can open the existing store
- The ability to infer mapping between the two models (for a lightweight migration), or a manual mapping model
- Permission to attempt to perform an automatic migration (for a lightweight migration)
It is therefore absolutely essential that you never make changes to the managed object model for a released version of an app. That is, if your app is already in the App Store, don’t change a single thing in that version of the managed object model.
Solution for the Crash while update an application from the app store:
Create a new version of the managed object model! This reminds me to mention some other best practices to adopt when working with Core Data:
- Create a new model version for every release version of an app
- Keep a copy of every release version of an app (you’re already doing this, right?)
- Keep a copy of every release version backing SQLite store containing suitable test data
Lightweight Migrations Can Do For You
Remember, you want to use lightweight migrations whenever possible because they are the simplest (and least error prone) option.
Lightweight migrations can handle the following changes:
- Adding or removing an entity, attribute, or relationship
- Making an attribute non-optional with a default value
- Making a non-optional attribute optional
- Renaming an entity or attribute using a renaming identifier
Steps1:
Replace the function from AppDelegate Class :
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo.sqlite"];
// handle db upgrade
NSDictionary *options = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES
};
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
Step2:
a) Select the model file.
b) Select Editor >> Add Model Version...
c) Leave the version name as 2 and click Finish.
d) Select .xcdatamodeld again (not PassingThoughts.xcdatamodel, that’s the old version) and this time in the File inspector (View\Utilities\Show File Inspector), in the "Model Version" section, select 2 for Current.
e) You should now see a little green circle with white checkmark badge on 2.xcdatamodel in the Project Navigator
Be sure to perform the steps
Detail tutorial from the below link :
The superb highly informative blog I’m about to share this with all my contacts.
ReplyDeleteiPhone developer in Pakistan
Thanks Jimmy :)
ReplyDeleteThank you Amit Sharm
ReplyDelete