无法为名为的类创建映射策略(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.xcdatamodelmyApp3.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 插入”错误

无法实例化名为 UICollectionView 的类

无法为实体“位置”加载名为“MyLocations.Location”的类

错误:NSInvalidUnarchiveOperationException:无法实例化名为 NSLayoutConstraint 的类

为啥gradle无法为flutter插件打开cp_proj重新映射的类缓存

Cocoa Touch 框架无法识别