Обновление значений в Core Data приводит к дублированию записей в Swift - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь обновить значения из основных данных для моего приложения для iPad. К сожалению, каждый раз, когда я обновляю данные, создается двойная запись.

Я кодировал ниже код, который принимает параметры, которые содержат значения, и пытается обновить. Но, к сожалению, он создает дублирующую запись, а не обновляет существующую.

        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        let context = appDelegate.persistentContainer.viewContext

        let entity = NSEntityDescription.entity(forEntityName: "Project", in: context)
        let newProject = NSManagedObject(entity: entity!, insertInto: context)

        let projectID = 1

        newProject.setValue(projectID, forKey: "projectID")
        newProject.setValue(projectName, forKey: "projectName")
        newProject.setValue(projectFinalDueDate, forKey: "projectFinalDueDate")
        newProject.setValue(ProjectNotes, forKey: "projectNotes")
        newProject.setValue(projectPriority, forKey: "projectPriority")
        newProject.setValue(projectAddedDate, forKey: "projectAddedDate")

        do {
            try context.save()
            showMessage(message: "Successfully update project", messageType: "success")
        } catch {
            showMessage(message: "Failed to update project", messageType: "error")
        }

Извините, если использованные мной ключевые слова неверны, и, пожалуйста, обратите внимание, что я новичок в Core Data, я начал использовать его, как несколько дней назад.

Спасибо, если кто-то может помочь мне решить эту проблему

Пожалуйста, найдите на экране запись вопроса

1 Ответ

0 голосов
/ 21 мая 2019

Вы создаете новый объект здесь

let newProject = NSManagedObject(entity: entity!, insertInto: context)

так что он добавит новый объект, вам нужно использовать предикат и обновить выбранное значение в соответствии с некоторым первичным ключом, а затем сохранить контекст как

    //As we know that container is set up in the AppDelegates so we need to refer that container.
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

    //We need to create a context from this container
    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest.init(entityName: "Project")
    fetchRequest.predicate = NSPredicate(format: "projectID  = %d",1)
    do
    {
        let test = try managedContext.fetch(fetchRequest)

         guard let newProject = test.first else { return }
            // update here 

           try managedContext.save()

        }
    catch
    {
        print(error)
    }

}
...