Я изменил свою структуру и сделал миграцию (создал новую Модель), данные добавляются и отображаются, все работает нормально, но когда я перезагружаю приложение, данные ядра пусты, в чем проблема?
static func saveToCoreData(_ words: Words?){
DispatchQueue.main.async {
coreDataResult(data: [words?.word, words?.translation], completion: { (result, taskObject, context) in
do {
let fetchedEntities = try context.fetch(result) as! [Favorite]
if let _ = fetchedEntities.first?.word {
print("the element already have in coreData")
} else {
taskObject?.setValue(words?.word, forKey: "word")
taskObject?.setValue(words?.translation, forKey: "translation")
taskObject?.setValue(words?.descript, forKey: "wordDesc")
taskObject?.setValue(words?.translDesc, forKey: "translDesc")
do {
try context.save()
} catch {
print(error)
}
}
} catch {}
})
}
}
static func coreDataResult(data: [[String?]?]?, completion: @escaping (NSFetchRequest<NSFetchRequestResult>, Favorite?, NSManagedObjectContext) -> ()){
guard let w = data?.first, let word = w, let t = data?.last, let transl = t else { return }
DispatchQueue.main.async {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
guard let entity = NSEntityDescription.entity(forEntityName: "Favorite", in: context) else { return }
guard let taskObject = NSManagedObject(entity: entity, insertInto: context) as? Favorite else { return }
let predicate = NSPredicate(format: "word == %@", word)
let predicate2 = NSPredicate(format: "translation == %@", transl)
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Favorite")
let andPredicate = NSCompoundPredicate(type: .and, subpredicates: [predicate, predicate2])
fetchRequest.predicate = andPredicate
completion(fetchRequest, taskObject, context)
}
}
Вам нужно будет написать миграционную политику, судя по всему.





я решил это
этот ответ помог мне - https://stackoverflow.com/a/40662940/8070211

создать подкласс NSEntityMigrationPolicy
class FavoriteEntityMigrationPolicy: NSEntityMigrationPolicy {
@objc func typeFor(word:String) -> [String] {
return [word]
}
}
выберите модель -> выбрать объект -> добавить подкласс в пользовательскую политику
выберите модель -> выбрать сущность -> выберите выражение значения -> ДобавитьFUNCTION($entityPolicy, "typeForWord:" , $source.word)
Вы изменили тип данных атрибута «слово» со строки на трансформируемый. Облегченная миграция не может сделать это автоматически. Вам нужно сделать это вручную.