NSFetchRequestResult возвращает дубликаты данных из базы данных

#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()
}
 

Таким образом, вы удалите неисправные (дубликаты) объекты из контекста