核心数据NSManagedObjectContext与NSMergePolicyType - 崩溃

时间:2018-02-04 14:36:09

标签: ios swift database sqlite core-data

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

我在xcdatamodeld中添加了对表的约束(带有“id”) enter image description here

这是我的背景:

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
    }()

这就是保存:

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

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

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

错误:

-[_SwiftValue resolveConflicts:error:]: unrecognized selector sent to instance 0x1d0256680

核心数据日志:

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

Everting正在寻找,只有当我有一个id冲突时才崩溃。 (试试iphone 8,ios 11.2)

1 个答案:

答案 0 :(得分:4)

发现问题:

mergePolicy是一种&#34; Any&#34;这意味着你可以插入任何错误的对象。

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

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

崩溃!:

managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType

工作:

managedObjectContext.mergePolicy = NSMergePolicy(merge: NSMergePolicyType.overwriteMergePolicyType)

也工作:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy