No suitable mapping model found for core data migration

前端 未结 5 1811
走了就别回头了
走了就别回头了 2020-12-29 12:15

I\'m trying to perform an iOS Core Data migration that requires a MappingModel. Core data is not able to use the mapping model for some reason and it falls back to an automa

5条回答
  •  余生分开走
    2020-12-29 12:18

    In your persistentStoreCoordinator method give this line of code

     NSDictionary *options=[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption, nil];
    

    If this doesnt help then you need to go for user implemented migration. So you will have to create a mapping model using source and destination model. In that case set,

    NSDictionary *options=[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:NO],NSInferMappingModelAutomaticallyOption, nil];
    

    Create douce metadata with following code

    if (sourceMetadata) {
            NSString *configuration = nil;
            NSManagedObjectModel *destinationModel = [self.persistentStoreCoordinator managedObjectModel];
    
            //Our Source 1 is going to be incompatible with the Version 2 Model, our Source 2 won't be...
            BOOL pscCompatible = [destinationModel isConfiguration:configuration compatibleWithStoreMetadata:sourceMetadata];
            NSLog(@"Is the STORE data COMPATIBLE? %@", (pscCompatible==YES) ?@"YES" :@"NO");
    
            if (pscCompatible == NO) {
                migrationSuccess = [self performMigrationWithSourceMetadata:sourceMetadata toDestinationModel:destinationModel];
            }
        }
        else {
            NSLog(@"checkForMigration FAIL - No Source Metadata! \nERROR: %@", [error localizedDescription]);
        }
    

    and implement the following function

    - (BOOL)performMigrationWithSourceMetadata :(NSDictionary *)sourceMetadata toDestinationModel:(NSManagedObjectModel *)destinationModel
    {
        BOOL migrationSuccess = NO;
        //Initialise a Migration Manager...
        NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:nil
                                                                        forStoreMetadata:sourceMetadata];
        //Perform the migration...
        if (sourceModel) {
            NSMigrationManager *standardMigrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel
                                                                                          destinationModel:destinationModel];
            //Retrieve the appropriate mapping model...
            NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:nil
                                                                    forSourceModel:sourceModel
                                                                  destinationModel:destinationModel];
            if (mappingModel) {
                NSError *error = nil;
                NSString *storeSourcePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Recipes.sqlite"];
                NSURL *storeSourceUrl = [NSURL fileURLWithPath: storeSourcePath];
                NSString *storeDestPath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Recipes2.sqlite"];
                NSURL *storeDestUrl = [NSURL fileURLWithPath:storeDestPath];
    
                //Pass nil here because we don't want to use any of these options:
                //NSIgnorePersistentStoreVersioningOption, NSMigratePersistentStoresAutomaticallyOption, or NSInferMappingModelAutomaticallyOption
                NSDictionary *sourceStoreOptions = nil;
                NSDictionary *destinationStoreOptions = nil;
    
                migrationSuccess = [standardMigrationManager migrateStoreFromURL:storeSourceUrl
                                                                            type:NSSQLiteStoreType
                                                                         options:sourceStoreOptions
                                                                withMappingModel:mappingModel
                                                                toDestinationURL:storeDestUrl
                                                                 destinationType:NSSQLiteStoreType
                                                              destinationOptions:destinationStoreOptions
                                                                           error:&error];
                NSLog(@"MIGRATION SUCCESSFUL? %@", (migrationSuccess==YES)?@"YES":@"NO");
            }
        }
        else {
            //TODO: Error to user...
            NSLog(@"checkForMigration FAIL - No Mapping Model found!");
            abort();
        }
        return migrationSuccess;
    }
    

提交回复
热议问题