我一直在尝试在我正在整理的应用程序中使用自定义迁移策略。到目前为止,迁移工作从v1开始 - > v2使用映射模型时。但是,每当我向实体映射添加自定义策略时,迁移都拒绝为v2工作 - > V3。
自定义迁移政策:
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
}
}
当我运行应用程序时,会返回以下错误:
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.])
重要部分是:
NSUnderlyingException=Couldn't create mapping policy for class named (ObjectCustomV2V3Migration)
我已经尝试过在这个问题上找到的几个问题,但没有一个问题提供任何令人满意的解决方案。如果有人能够解决我面临的问题,我将非常感激!
谢谢!
答案 0 :(得分:37)
在理解了类似问题的答案之后,我最终解决了这个问题。我忘了添加项目命名空间,所以我应该使用ObjectCustomV2V3Migration
而不是在映射模型中将自定义策略名称设置为ProjectModuleName.ObjectCustomV2V3Migration
。
答案 1 :(得分:4)
我的问题是我的项目名称中有空格,所以在映射模型编辑器中,应该在指定Swift模块名称时使用下划线而不是空格来指定自定义策略。
例如,要在名为我的应用名称的项目中指定const routes = [
{
path:'/',
component:Home,
},
{
path: "*",
component: NotFound
}
]
类,我在编辑器中使用了以下自定义策略:
console.clear()
const Foo = { template: '<div>foo</div>' }
const NotFound = { template: '<div>404 page</div>' }
const routes = [
{ path: '/foo', component: Foo },
{ path: '*', component: NotFound }
]
const router = new VueRouter({
routes
})
const app = new Vue({
router
}).$mount('#app')