@@ -698,28 +698,38 @@ - (BOOL)loadMetadata:(NSError **)error {
698698 NSDictionary *options = [self options ];
699699 if ([[options objectForKey: NSMigratePersistentStoresAutomaticallyOption ] boolValue ] &&
700700 [[options objectForKey: NSInferMappingModelAutomaticallyOption ] boolValue ]) {
701+ NSManagedObjectModel *newModel = [[self persistentStoreCoordinator ] managedObjectModel ];
702+
703+ // check that a migration is required first:
704+ if ([newModel isConfiguration: nil compatibleWithStoreMetadata: metadata]){
705+ return YES ;
706+ }
707+
708+ // load the old model:
701709 NSMutableArray *bundles = [NSMutableArray array ];
702710 [bundles addObject: [NSBundle mainBundle ]];
703- NSManagedObjectModel *oldModel = [NSManagedObjectModel
704- mergedModelFromBundles: bundles
705- forStoreMetadata: metadata];
706- NSManagedObjectModel *newModel = [[self persistentStoreCoordinator ] managedObjectModel ];
711+ NSManagedObjectModel *oldModel = [NSManagedObjectModel mergedModelFromBundles: bundles
712+ forStoreMetadata: metadata];
713+
707714 if (oldModel && newModel) {
708715
709- if (![oldModel isEqual: newModel]) {
710- // run migrations
711- if (![self migrateFromModel: oldModel toModel: newModel error: error]) {
712- return NO ;
713- }
714-
715- // update metadata
716- NSMutableDictionary *mutableMetadata = [metadata mutableCopy ];
717- [mutableMetadata setObject: [newModel entityVersionHashesByName ] forKey: NSStoreModelVersionHashesKey ];
718- [self setMetadata: mutableMetadata];
719- if (![self saveMetadata ]) {
720- if (error) { *error = [self databaseError ]; }
721- return NO ;
722- }
716+ // no migration is needed if the old and new models are identical:
717+ if ([[oldModel entityVersionHashesByName ] isEqualToDictionary: [newModel entityVersionHashesByName ]]) {
718+ return YES ;
719+ }
720+
721+ // run migrations
722+ if (![self migrateFromModel: oldModel toModel: newModel error: error]) {
723+ return NO ;
724+ }
725+
726+ // update metadata
727+ NSMutableDictionary *mutableMetadata = [metadata mutableCopy ];
728+ [mutableMetadata setObject: [newModel entityVersionHashesByName ] forKey: NSStoreModelVersionHashesKey ];
729+ [self setMetadata: mutableMetadata];
730+ if (![self saveMetadata ]) {
731+ if (error) { *error = [self databaseError ]; }
732+ return NO ;
723733 }
724734
725735 } else {
@@ -729,7 +739,7 @@ - (BOOL)loadMetadata:(NSError **)error {
729739 *error = [NSError errorWithDomain: EncryptedStoreErrorDomain code: EncryptedStoreErrorMigrationFailed userInfo: userInfo];
730740 }
731741 return NO ;
732- }
742+ }
733743 }
734744
735745 }
0 commit comments