I've been trying to use a custom migration policy in an application I'm putting together. So far migrations have worked from v1 -> v2 when using a mapping model. However, whenever I add a custom policy to an entity mapping, the migration refuses to work for v2 -> v3.
Custom Migration Policy:
import Foundation
import CoreData
class ObjectCustomV2V3Migration: NSEntityMigrationPolicy {
override func createDestinationInstancesForSourceInstance(sInstance: NSManagedObject, entityMapping mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool {
var newObject:NSManagedObject? = NSEntityDescription.insertNewObjectForEntityForName(mapping.destinationEntityName!, inManagedObjectContext: manager.destinationContext) as? NSManagedObject
// Sets attr31 - string attribute
var str:String = sInstance.valueForKey("attr21") as String
if str == "" {
str = "BlanketyBlank"
}
newObject?.setValue(str, forKey: "attr31")
// Sets attr32 (int16 attribute) as double of value in previous version
// ignore the dodgy type casting.
var num:Int = sInstance.valueForKey("attr22") as Int
num *= 2
var num16 = NSNumber(integer: num)
newObject?.setValue(num16, forKey: "attr32")
if newObject != nil {
manager.associateSourceInstance(sInstance, withDestinationInstance: newObject!, forEntityMapping: mapping)
return true
}
return false
}
}
and when I run the app, the following error is returned:
2015-07-10 14:32:42.952 SingleDBMigration[2153:739674] CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Containers/Data/Application/6C142EC2-02DB-4BD6-8428-5739C57C7795/Documents/SingleDBMigration.sqlite options:{
NSInferMappingModelAutomaticallyOption = 0;
NSMigratePersistentStoresAutomaticallyOption = 1;
} ... returned error Error Domain=NSCocoaErrorDomain Code=134110 "The operation couldn’t be completed. (Cocoa error 134110.)" UserInfo=0x17ecad70 {NSUnderlyingException=Couldn't create mapping policy for class named (ObjectCustomV2V3Migration)} with userInfo dictionary {
NSUnderlyingException = "Couldn't create mapping policy for class named (ObjectCustomV2V3Migration)";
}
2015-07-10 14:32:42.965 SingleDBMigration[2153:739674] Unresolved error Optional(Error Domain=YOUR_ERROR_DOMAIN Code=9999 "Failed to initialize the application's saved data" UserInfo=0x17eaf880 {NSLocalizedDescription=Failed to initialize the application's saved data, NSUnderlyingError=0x17ecad90 "The operation couldn’t be completed. (Cocoa error 134110.)", NSLocalizedFailureReason=There was an error creating or loading the application's saved data.}), Optional([NSLocalizedDescription: Failed to initialize the application's saved data, NSUnderlyingError: Error Domain=NSCocoaErrorDomain Code=134110 "The operation couldn’t be completed. (Cocoa error 134110.)" UserInfo=0x17ecad70 {NSUnderlyingException=Couldn't create mapping policy for class named (ObjectCustomV2V3Migration)}, NSLocalizedFailureReason: There was an error creating or loading the application's saved data.])
with the important part being:
NSUnderlyingException=Couldn't create mapping policy for class named (ObjectCustomV2V3Migration)
I've tried the few questions I have found on this problem, and none of them have provided any satisfactory solutions. I'd be very thankful if anybody could shed any light on the issue I'm facing!
Thanks!
I eventually solved this, after understanding an answer to a similar question. I had forgotten to add the project namespace, so rather than setting the custom policy name as ObjectCustomV2V3Migration
in the Mapping Model, I should have used ProjectModuleName.ObjectCustomV2V3Migration
.
My issue was that my project name had spaces in it, so in the mapping model editor the custom policy should be specified using underscores instead of spaces when specifying the Swift module name.
For example, to specify the MyCustomMigrationPolicy
class in the project named My App Name, I used the following custom policy in the editor:
My_App_Name.MyCustomMigrationPolicy
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With