带有NSMergePolicyType的核心数据NSManagedObjectContext-崩溃

Yai*_*dad 3 database sqlite core-data ios swift

我为上下文添加了NSMergePolicyType,但是每次遇到冲突时,应用程序都会崩溃。

我向xcdatamodeld中的表添加了约束(带有“ id”) 在此处输入图片说明

这是我的情况:

lazy var managedObjectContext: NSManagedObjectContext? =
    {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = coordinator
        managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType
        return managedObjectContext
    }()
Run Code Online (Sandbox Code Playgroud)

这是保存:

func saveContext(onSuccess: (() -> Void)?) {
        if let moc = self.managedObjectContext {
            moc.perform {
                if moc.hasChanges {
                    do {
                        try moc.save()
                        onSuccess?()
                    } catch {
                        print("SaveContext error \(error)")
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

但是,当我与ID发生冲突时,应用程序崩溃了

  • 在创建的第一个实体上,一切正常
  • 但是当我添加具有相同ID的实体时,应用程序崩溃了。

错误:

-[_SwiftValue resolveConflicts:error:]: unrecognized selector sent to instance 0x1d0256680
Run Code Online (Sandbox Code Playgroud)

核心数据日志:

CoreData: annotation: sql connection fetch time: 0.0001s
CoreData: annotation: total fetch execution time: 0.0001s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 
0xd000000000080004 <x-coredata://E7F35452-965D-460D-AAFE-
5ED17B8E0174/DatapulseEntity/p2>
CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, t0.Z_OPT, t0.ZCREATEDTIME, 
t0.ZDELETEDTIME, t0.ZDESCRIPTION_VALUE, t0.ZID, t0.ZIS_MY_FAVORITE, 
t0.ZIS_SELF_LIKED, t0.ZIS_SELF_SAVED_OFFLINE, t0.ZIS_SELF_VIEWED, 
t0.ZIS_SHARED, t0.ZLIKES, t0.ZNAME, t0.ZPARENT_ID, t0.ZTHUMBNAIL, 
t0.ZTYPE, t0.ZUPDATEDTIME, t0.ZVIEWS, t0.ZLINKS, t0.ZREFRESHRATE FROM ZKNOWLEDGEBASEENTITY t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0000s
CoreData: annotation: total fetch execution time: 0.0000s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 
0xd000000000040004 <x-coredata://E7F35452-965D-460D-AAFE-5ED17B8E0174/KnowledgeBaseEntity/p1>
2018-02-04 16:18:30.149318+0200[49571:18233278] -[_SwiftValue resolveConflicts:error:]: unrecognized selector sent to instance 0x1d0256680
Run Code Online (Sandbox Code Playgroud)

Everting正在工作中,只有当我有ID冲突时,它才会崩溃。(尝试在iPhone 8和iOS 11.2上使用)

Yai*_*dad 5

发现了问题:

mergePolicy是“任何”类型,这意味着您可以插入任何会出错的对象。

但是 mergePolicy必须获取一个mergePolicy对象,任何其他对象都将导致系统崩溃。

我所做的是传递mergePolicyType而不是对象。

崩溃!:

managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType
Run Code Online (Sandbox Code Playgroud)

工作:

managedObjectContext.mergePolicy = NSMergePolicy(merge: NSMergePolicyType.overwriteMergePolicyType)
Run Code Online (Sandbox Code Playgroud)

还可以工作:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
Run Code Online (Sandbox Code Playgroud)