CoreData с использованием NSBatchInsertRequest
Я пытаюсь вставить массив словаря в CoreData
с помощью NSBatchInsertRequest
согласно WWDC 2019 (https://developer.apple.com/videos/play/wwdc2019/230/). InsertResult равен нулю, а мои 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 ответа
Ваша линия let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertRequest
должно быть:let insertResult = try? moc.execute(insertRequest) as? NSBatchInsertResult
Проблема устранения неоднозначности заключается в том, что во время работы приложения у вас открыто несколько основных стеков данных. Это потому, что у вас есть приложение и стек для тестов? или потому что ваше приложение использует более одного?
Ошибка CoreData: warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass 'CoreDataPerformance.Client' so +entity is unable to disambiguate.
означает, что в вашей модели есть несколько сущностей, использующих Client
NSManagedObject
подкласс, должен быть только один.
Другая проблема с вашим кодом: automaticallyMergesChangesFromParent
не работает с пакетными запросами, потому что не генерируется уведомление о сохранении. Вы должны использоватьNSPersistentStoreRemoteChangeNotification
, NSPersistentHistoryChangeRequest
а также mergeChangesFromContextDidSaveNotification
методика объясняется в WWDC 2018 Core Data Best Practices @ 21:57
Я думаю, что в разговоре о WWDC есть ошибка. Попробуйте сделать это:
let insertRequest = NSBatchInsertRequest(entity: Client.entity(), objects: clients)
try! moc.execute(insertRequest)
try! moc.save()
Я пробовал! просто чтобы я мог видеть любую ошибку. Вы можете это изменить