【问题标题】:How to perform migration when changed relationship from many to one?当关系从多变为一时如何执行迁移?
【发布时间】:2017-04-14 20:33:36
【问题描述】:

这是我在 Business 实体的源模型中拥有的:

这就是我在 Business 实体的目标模型中所拥有的:

如你所见,我将关系从多变为一,从 users 变为 user

但现在我有以下错误:

URL:file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/POSowner.sqlite 选项:{
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
} ... 返回错误 错误域 = NSCocoaErrorDomain 代码 = 134110 “持久存储迁移期间发生错误。” UserInfo={sourceURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/POSowner.sqlite,原因=无法就地迁移存储:验证错误缺少属性值关于强制目标关系,destinationURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/.POSowner.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, NSUnderlyingError=0x170458990 {Error Domain =134110 "持久存储迁移期间发生错误。" UserInfo={entity=Business,attribute=user,reason=Validation error missing attribute values on强制目的地关系}}}与userInfo字典{
    NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"在持久存储迁移期间发生错误。\" UserInfo={entity=Business, attribute=user, reason=Validation error missing attribute values on强制目标关系}";
    destinationURL = "file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/.POSowner.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3";
    原因=“无法就地迁移存储:验证错误缺少强制目标关系上的属性值”;
    sourceURL = "file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/POSowner.sqlite";
}
致命错误:“试试!”表达式意外引发错误:错误域 = NSCocoaErrorDomain 代码 = 134110“持久存储迁移期间发生错误。” UserInfo={sourceURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/POSowner.sqlite,原因=无法就地迁移存储:验证错误缺少属性值关于强制目标关系,destinationURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/.POSowner.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, NSUnderlyingError=0x170458990 {Error Domain =134110 "持久存储迁移期间发生错误。" UserInfo={entity=Business, attribute=user, reason=Validation error missing attribute values on强制目的地关系}}}:文件/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.58.6/src/ swift/stdlib/public/core/ErrorType.swift,第 178 行
2016-11-30 14:25:43.070185 POSowner [3474:513840] 致命错误:“尝试!”表达式意外引发错误:错误域 = NSCocoaErrorDomain 代码 = 134110“持久存储迁移期间发生错误。” UserInfo={sourceURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/POSowner.sqlite,原因=无法就地迁移存储:验证错误缺少属性值关于强制目标关系,destinationURL=file:///private/var/mobile/Containers/Shared/AppGroup/00C2A6C6-8149-4CF7-95E1-6ABD8A2B3B57/.POSowner.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, NSUnderlyingError=0x170458990 {Error Domain =134110 "持久存储迁移期间发生错误。" UserInfo={entity=Business, attribute=user, reason=Validation error missing attribute values on强制目的地关系}}}:文件/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.58.6/src/ swift/stdlib/public/core/ErrorType.swift,第 178 行

我不知道如何解决这个问题。有什么想法吗?

这就是我设置核心数据堆栈的方式:

静态函数 mr_setupCoreDataStack() { 守卫 NSPersistentStoreCoordinator.mr_default() == nil else { 返回 } 让 managedObjectModel = NSManagedObjectModel.mr_default() 让 persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel!) var storePath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: SharedGroupName) storePath = storePath!.appendingPathComponent("POSowner.sqlite") 让选项 = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] 尝试! persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storePath, options: options) NSPersistentStoreCoordinator.mr_setDefaultStoreCoordinator(persistentStoreCoordinator) NSManagedObjectContext.mr_initializeDefaultContext(with: persistentStoreCoordinator) }

【问题讨论】:

    标签: ios swift core-data-migration


    【解决方案1】:

    最简单的解决方案是删除当前数据库并允许MagicalRecord 创建一个新数据库而不进行任何迁移。请记住只执行一次

    static func mr_setupCoreDataStack() {
    
        var storePath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: SharedGroupName)
        storePath = storePath!.appendingPathComponent("POSowner.sqlite")
        try! FileManager.default.removeItem(at: storePath!)
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2018-02-23
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多