无法为名为的类创建映射策略(Cocoa 错误 134110)
Posted
技术标签:
【中文标题】无法为名为的类创建映射策略(Cocoa 错误 134110)【英文标题】:Couldn't create mapping policy for class named (Cocoa error 134110) 【发布时间】:2015-01-27 11:52:40 【问题描述】:我正在 Core Data 中进行手动/大量迁移。我有数据模型,即myApp2.xcdatamodel
和myApp3.xcdatamodel
。
myApp3
在两个表之间有一个新表(如联结表),它们都处于TO-MANY
关系中。
此外,我还定义了一个NSEntityMigrationPolicy
。现在,当我使用此自定义策略(专门为关系和管理数据而编写)运行时,我在调用 migrationManager.migrateStoreFromURL
Optional("Error Domain=NSCocoaErrorDomain Code=134110 \"The operation couldn’t be completed. (Cocoa error 134110.)\" UserInfo=0x7feda0d825b0 NSUnderlyingException=Couldn\'t create mapping policy for class named (MyTableToMyTablePolicy)")
我试图查看此错误,但从某种方式来看,它以 Policy 类为目标,我已将其粘贴在下面。
class MyTableToMyTablePolicy: NSEntityMigrationPolicy
override func createDestinationInstancesForSourceInstance(sourceInstance: NSManagedObject, entityMapping mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
let sourceKeys:[AnyObject] = sourceInstance.entity.attributesByName.keys.array
let sourceValues = sourceInstance.dictionaryWithValuesForKeys(sourceKeys)
let destinationInstance:NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(mapping.destinationEntityName!, inManagedObjectContext: manager.destinationContext) as NSManagedObject
let destinationKeys = destinationInstance.entity.attributesByName.keys.array as [AnyObject]
if mapping.userInfo!["modelVersion"]!.integerValue == 2
for key in destinationKeys
let value:AnyObject = sourceValues[key as String]!
if value.hasText()
destinationInstance.setValue(value, forKey: key as String)
else // call the super just
super.createDestinationInstancesForSourceInstance(sourceInstance, entityMapping: mapping, manager: manager, error: error)
manager.associateSourceInstance(sourceInstance, withDestinationInstance: destinationInstance, forEntityMapping: mapping)
return true
以下分别是 xcdatamodels myApp2 和 myApp3:
更新:崩溃日志:
【问题讨论】:
它说它无法创建迁移策略。您是否需要在自定义迁移策略名称前加上 swift 模块? @k6sandeep 非常好。 @Sandeep 这绝对是我的解决方案! 【参考方案1】:首先,
在 ios 上进行大量迁移是一个坏主意(tm)。大量迁移并不意味着要在 CPU、内存和启动时间有限的设备上运行。
第二,
您可能只显示了部分错误。你能显示整个错误堆栈吗?通常核心数据错误包含内部错误,您可以通过访问-userInfo
字典打印出来。这将使我们对错误有更深入的了解。
最后,
调试器在哪里中断?哪一行报错?
【讨论】:
1) 我应该避免在 iOS 上进行大量迁移吗? 2 & 3) 我得到的只是错误。在此之前,调试器上显示以下行:“CoreData:注释:与 sqlite 数据库断开连接。”该错误是由 NSMigrationManager 对象的 migrateStoreFromURL 中传递的 &error 参数引发的。 (问题已解决。我缺少模块名称,因为它现在需要在 Swift 中工作。感谢@k6sandeep) 很高兴它已解决。是的,您应该避免在 iOS 上进行大量迁移。繁重的迁移并不是为在 iOS 上运行而设计的。它在那里运行更多的是偶然而不是设计。至于你的错误;-userInfo
包含 within error
变量,它会给你子错误。这就是我要你打印出来的。
是的。渐进式迁移也有无限递归的风险,如果被误认为重迁移真的很冗长(我也发生过),这可能会冻结 iOS 设备。用户信息=0x7feda0d825b0。我还用崩溃日志更新了问题,以便进一步研究所有信息。谢谢你。
@MarcusS.Zarra 如果无法进行轻量级迁移,是否可以替代重度迁移?
@Simple99 是的,导出然后再次从源中导入或检索数据。如果数据不可恢复,导出/导入就是答案。以上是关于无法为名为的类创建映射策略(Cocoa 错误 134110)的主要内容,如果未能解决你的问题,请参考以下文章
休眠奇怪的“ORA-01400:无法将 NULL 插入”错误
无法为实体“位置”加载名为“MyLocations.Location”的类
错误:NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类