#swift #core-data
Вопрос:
У меня есть простая сущность с identifier
(ограничением) и name
полями. ViewController
Я пытаюсь добавлять данные в базу данных, не беспокоясь о дубликатах, и в базе данных действительно нет дубликатов данных, но когда я пытаюсь получить записи, я получаю их в два раза больше. Как я выяснил, это происходит только тогда, когда я пытаюсь что-то записать в базу данных, и независимо от того, была ли попытка успешной, данные поступают ко мне NSFetchRequestResult
. В чем причина такого поведения?
Содержимое базы данных теперь:
Контроллер просмотра:
class ViewController: UIViewController {
let moc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
override func viewDidLoad() {
super.viewDidLoad()
//if comment this loop I won't get duplicates
for i in 0...5 {
let ent = Entity(context: moc)
ent.identifier = Int16(i)
ent.name = "Username"
try? moc.save() //if the code is not executed for the first time, then the attempt is unsuccessful due to identifier constraint
}
let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")
let fetchedEntities = try? moc.fetch(fetch) as? [Entity]
print(fetchedEntities!.count) // Output: 12 (actually only 6 records in the db)
}
}
Комментарии:
1. Итак, у вас есть 6 записей, а затем вы добавляете еще 6 и удивляетесь, что получаете 12 обратно из запроса на извлечение? Скажи мне, что я что-то упускаю…
2. 6 записи не добавляются в базу данных, поскольку записи с этим
identifier
значением поля уже существуют
Ответ №1:
Измените свой код, в котором вы создаете объекты, чтобы
for i in 0...5 {
let ent = Entity(context: moc)
ent.identifier = Int16(i)
ent.name = "Username"
}
do {
try moc.save()
} catch {
moc.reset()
}
Таким образом, вы удалите неисправные (дубликаты) объекты из контекста