Не удается сохранить данные в основные данные в основном потоке или частном потоке

Вчера мне удалось сохранить записи в основные данные, но затем я провел небольшой рефакторинг в своем проекте, чтобы сделать мой код чище (в основном код из моего 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, поле моей категории иногда равно нулю, и поэтому оно показывает эту ошибку, я прав?

А что касается получения данных из основных данных, теперь я извлекаю их из основного контекста, но данные сохраняются в другом контексте, что я могу сделать, чтобы это исправить?

0 ответов

Другие вопросы по тегам