5

我正在尝试CoreData根据NSBatchInsertRequestWWDC 2019 ( https://developer.apple.com/videos/play/wwdc2019/230/ ) 插入字典数组。insertResult 为 nil,我的 CoreData 为空。

let modelURL = Bundle.main.url(forResource: "CoreDataPerformance", withExtension: "momd")!
let model = NSManagedObjectModel(contentsOf: modelURL)!
let container = NSPersistentCloudKitContainer(name: "CoreDataPerformance", managedObjectModel: model)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
    if let error = error as NSError? {
        fatalError("Unresolved error \(error), \(error.userInfo)")
    }
})

try container.viewContext.setQueryGenerationFrom(.current)

let moc = container.viewContext
moc.automaticallyMergesChangesFromParent = true
moc.perform {
    let insertRequest = NSBatchInsertRequest(entity: Client.entity(), objects: clients)
    let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertRequest
    let success = insertResult?.resultType
    print("RESULT STATUS: \(success)")
}

这是我在控制台中收到的错误:

2020-02-04 18:30:25.800705+0200 CoreDataPerformance[62836:778869] [error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.

CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.

2020-02-04 18:30:25.800846+0200 CoreDataPerformance[62836:778869] [error] warning:   'Client' (0x600000c50bb0) from NSManagedObjectModel (0x600001877480) claims 'CoreDataPerformance.Client'.

CoreData: warning:   'Client' (0x600000c50bb0) from NSManagedObjectModel (0x600001877480) claims 'CoreDataPerformance.Client'.

2020-02-04 18:30:25.800940+0200 CoreDataPerformance[62836:778869] [error] warning:   'Client' (0x600000c589a0) from NSManagedObjectModel (0x600001861680) claims 'CoreDataPerformance.Client'.

CoreData: warning:   'Client' (0x600000c589a0) from NSManagedObjectModel (0x600001861680) claims 'CoreDataPerformance.Client'.
4

4 回答 4

1

你的线let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertRequest

应该: let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertResult

于 2020-04-08T17:46:00.203 回答
0

该错误CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.意味着您的模型中有多个使用Client NSManagedObject子类的实体,应该只有一个。

您的代码的另一个问题是automaticallyMergesChangesFromParent不适用于批处理请求,因为没有生成保存通知。您必须使用NSPersistentStoreRemoteChangeNotification,该NSPersistentHistoryChangeRequest技术mergeChangesFromContextDidSaveNotificationWWDC 2018 Core Data Best Practices @ 21:57中进行了解释

于 2020-08-05T08:04:46.767 回答
0

消歧问题是因为您在应用程序运行时打开了多个核心数据堆栈。这是因为你有你的应用程序和一个测试堆栈吗?还是因为您的应用程序使用了多个?

于 2020-06-26T17:04:18.110 回答
-1

我认为 WWDC 演讲中有一个错误。尝试这样做:

let insertRequest = NSBatchInsertRequest(entity: Client.entity(), objects: clients)
try! moc.execute(insertRequest)
try! moc.save()

我用过试试!就这样我可以看到任何错误。你可以改变它

于 2020-02-13T02:44:31.317 回答