Manual Migration Example or help with mine

Hi,


I tried to automatically migrate my database, I didn't get any errors, however all the existing Entitiy rows are missing after automatic migration.

So I tried manual migration without much luck.


Does anyone have a full example of a manual migration using NSMigrationManager.migrateStore?

The only example I have found so fat is the objc.io one, but it doesn't use migrateStore.


I am following the Core Data Programming Guide but the parameters are not really specified in their examples.


I am having issues working out how to specify some of the parameters, particularly around what the sourceModel and destinationModel should actually point to.

sourceVersion = "2.5.2" (My App Store Core Data Version)

destinationVersion = "2.5.3" (Development version with lots of changes)


sourceModelUrl = file:///Users/MyName/Library/Developer/CoreSimulator/Devices/38B3746B-9BDF-4641-9783-4FAAE00DA369/data/Containers/Bundle/Application/D94FAD26-A12D-4486-8E67-618778B7A80E/XXXXXX.app/APDataModel.momd/APDataModel%202.5.2.mom

destinationModelUrl = file:///Users/MyName/Library/Developer/CoreSimulator/Devices/38B3746B-9BDF-4641-9783-4FAAE00DA369/data/Containers/Bundle/Application/D94FAD26-A12D-4486-8E67-618778B7A80E/XXXXXX.app/APDataModel.momd/APDataModel%202.5.3.mom


sourceModel = an NSManagedObjectModel loaded from the above sourceModelUrl

destinationModel = an NSManagedObjectModel loaded from the above destinationModelUrl


coreDataManager.databaseURL = file:///Users/MyName/Library/Developer/CoreSimulator/Devices/38B3746B-9BDF-4641-9783-4FAAE00DA369/data/Containers/Data/Application/0A734ABB-99EC-4F39-9BCC-66E34A7BC497/Documents/APDataModel.sqlite

coreDataManager.storeType = "SQLite"


I tried using NSPersistentStoreCoordinator.metadataForPersistentStore and NSManagedObjectModel.mergedModel to get the sourceModel but that just gave me errors.


        guard let sourceModelUrl = coreDataManager.modelUrl( forVersion:sourceVersion),
            let destinationModelUrl = coreDataManager.modelUrl( forVersion:destinationVersion) else
        {
            return false
        }

        guard let sourceModel = sourceModel( forVersion:sourceVersion),
              let destinationModel = destinationModel( forVersion:destinationVersion) else
        {
            return false
        }

        guard let mappingModel = NSMappingModel( from:[Bundle.main],
                                                 forSourceModel:sourceModel,
                                                 destinationModel:destinationModel) else
        {
            return false
        }
        let migrationManager = NSMigrationManager( sourceModel:sourceModel,
                                                   destinationModel:destinationModel)
        do
        {
            try migrationManager.migrateStore( from:coreDataManager.databaseURL,
                                               sourceType:coreDataManager.storeType,
                                               options:[:],
                                               with:mappingModel,
                                               toDestinationURL:destinationModelUrl,
                                               destinationType:coreDataManager.storeType,
                                               destinationOptions:[:])
        }
        catch let error
        {
            print("error in migration: \(error)")
            return false
        }


This throws an error which I can't really paste all of as it shows a lot of my data model which belongs to my client.

However the interesting parts:

CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null)

38B3746B-9BDF-4641-9783-4FAAE00DA369/data/Containers/Data/Application/0A734ABB-99EC-4F39-9BCC-66E34A7BC497/Documents/APDataModel.sqlite options:{

NSReadOnlyPersistentStoreOption = 1;

} ... returned error Error Domain=NSCocoaErrorDomain Code=134100 "(null)" UserInfo={metadata={

[ MY CORE DATA SCHEMA IS LISTED HERE, IT LOOKS LIKE VERSION 2.5.3 ]

}, reason=The model used to open the store is incompatible with the one used to create the store} with userInfo dictionary {

[ MY CORE DATA SCHEMA IS LISTED HERE AGAIN, IT LOOKS LIKE VERSION 2.5.3 AGAIN ]

};

reason = "The model used to open the store is incompatible with the one used to create the store";

}


I am really stuck, have been working on this for days and any help would be really appreciated.


Ps. Sorry about the ****** username, must have created it when having a bad Xcode day.

Replies

Hi, I'm getting this exact issue. Did you ever figure out how to resolve it?