CoreData 在迁移时崩溃,NSMigrationConstraintViolationError = 134111 错误

sha*_*oga 6 core-data core-data-migration ios swift

我正在NSPersistentStoreCoordinator从服务器创建一个新的后台长期节省。它工作正常,但突然我看到生产崩溃并出现以下错误 -

CRASH_INFO_ENTRY_0 致命错误:后台上下文创建失败,错误错误域=NSCocoaErrorDomain 代码=134110“持久存储迁移期间发生错误。” UserInfo={sourceURL=file:///var/mobile/Containers/Data/Application/8EF27C05-1755-49EE-B174-8B163CC7CC1D/Documents/App.sqlite,reason=无法就地迁移存储:尝试迁移期间违反约束,DESTINATIONURL =文件:///var/mobile/Containers/Data/Application/8EF27C05-1755-49EE-B174-8B163CC7CC1D/Documents/.App.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3,NSUnderlyingError = 0x170a56290 {错误域= NSCocoaErrorDomain代码= 134111“( null)" UserInfo={reason=在尝试迁移期间违反约束,NSUnderlyingException=违反约束,_NSCoreDataOptimisticLockingFailureConflictsKey=("")}}}:

看起来我有一个约束问题,因为这是我得到的错误 -

NSMigrationConstraintViolationError = 134111, // 由于违反唯一性约束,迁移失败

但是 _NSCoreDataOptimisticLockingFailureConflictsKey is <null>我无法追踪这个问题。

这是我的代码 -

    lazy var backgroundSyncContext:NSManagedObjectContext =  {
        let psc = NSPersistentStoreCoordinator(managedObjectModel: NSManagedObjectModel.MR_defaultManagedObjectModel()!)
        let context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
        context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        context.undoManager = nil
        context.persistentStoreCoordinator = psc
        let mOptions = [NSMigratePersistentStoresAutomaticallyOption: true,
        NSInferMappingModelAutomaticallyOption: true]

        let paths = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
        let applicationDocumentURL = paths.last!.absoluteString?.stringByReplacingOccurrencesOfString("%20", withString: " ")
        let documentPath = paths.last!

        let storeUrl = documentPath.URLByAppendingPathComponent("Prep4\(AppConfig.sharedInstance.examName).sqlite")

        do {

            try context.persistentStoreCoordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeUrl, options: mOptions)
            print("Created background context")

        } catch (let error){

            fatalError("Background context creation failed with error \(error)")
        }

        return context

    }()
Run Code Online (Sandbox Code Playgroud)

编辑

好的,我有一个猜测 - 是我向模型添加约束的最新版本。用户设备上的旧版本是否有可能包含对新约束无效的重复项,因此迁移失败。

这听起来合理吗?

谢谢沙妮