Не удается сохранить данные в основные данные в основном потоке или частном потоке
Вчера мне удалось сохранить записи в основные данные, но затем я провел небольшой рефакторинг в своем проекте, чтобы сделать мой код чище (в основном код из моего DTO, где я кодирую/декодирую данные с помощью NSCoder, и создал отдельные файлы для своих пользовательских преобразователей значений). )
После этого я заметил, что сохранение данных перестало работать, это мой код для добавления:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
func add(pet: PetDTO) {
let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.perform {
let newPet = PetEntity(context: managedObjectContext)
newPet.id = Int64(pet.id)
newPet.name = pet.name
newPet.category = pet.category
newPet.photoUrls = pet.photoUrls
newPet.tags = pet.tags
newPet.status = pet.status.rawValue
do {
try self.context.save()
} catch {
print(error)
}
}
}
I Кажется, я упускаю что-то, связанное с контекстами. я создал этоmanagedObjectContext
и насколько я понимаю, я должен был сохранить данные по этому контексту, но ничего не происходит. я пытался удалитьlet managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
и сохранение в основном контексте, но у меня была эта ошибка:
CoreData: error: SQLCore dispatchRequest: exception handling request: <NSSQLSaveChangesRequestContext: 0x600000156640> , <shared NSSecureUnarchiveFromData transformer> threw while encoding a value. with userInfo of (null)
Error Domain=NSCocoaErrorDomain Code=134060 "A Core Data error occurred."
Мне удалось решить ее, только добавив еще один контекст и передав его в PetEntity.
Так вот вопрос: что я делаю не так? Можно ли как-то объединить контексты? Я видел способ для этого, но не уверен, что он мне нужен.
Спасибо
Обновление: изменил мой код на это:
do {
try managedObjectContext.save()
} catch {
print(error)
}
Только что понял, что не сохранил его в правильном контексте. Теперь у меня естьnilError
и он все еще не сохранился в базе данных. Я думаю, это происходит из-за того, что я получаю неверные данные из Json, поле моей категории иногда равно нулю, и поэтому оно показывает эту ошибку, я прав?
А что касается получения данных из основных данных, теперь я извлекаю их из основного контекста, но данные сохраняются в другом контексте, что я могу сделать, чтобы это исправить?