【问题标题】:core data NSManagedObjectContext with NSMergePolicyType - Crash带有 NSMergePolicyType 的核心数据 NSManagedObjectContext - 崩溃
【发布时间】:2018-07-14 12:28:58
【问题描述】:

我为我的上下文添加了 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
    }()

这是存档:

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 正在工作 find ,只有当我有 id 冲突时它才会崩溃。 (在 iphone 8、ios 11.2 上试用)

【问题讨论】:

    标签: ios swift database sqlite core-data


    【解决方案1】:

    发现问题:

    mergePolicy 是“Any”的一种,这意味着您可以插入任何对象而不会出错。

    但是 mergePolicy 必须得到一个 mergePolicy 对象,任何其他对象都会导致系统崩溃。

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

    崩溃!:

    managedObjectContext.mergePolicy = NSMergePolicyType.overwriteMergePolicyType
    

    工作:

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

    也可以工作:

    managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-09
      • 2023-03-14
      • 2018-09-02
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多