Базовые данные context.save продолжают добавлять записи с нулевой ячейкой, хотя такие управляемые объекты не были добавлены в контекст - PullRequest
0 голосов
/ 06 июня 2019

Я пишу приложение, которое сохраняет сущности Movie с использованием Core Data. Кино - это единственная сущность, и есть только один атрибут name: String.

Есть два контроллера вида. Таблица VC в качестве корня навигационной панели и addMovie VC в качестве модального перехода от кнопки «+» на панели навигации.

Описание проблемы:
1) Запустите приложение и извлеките ранее сохраненные фильмы из базы данных, чтобы заполнить табличное представление. Этот шаг работает нормально.
2) Нажмите кнопку «+», чтобы запустить addMovie VC и добавить новый фильм. Этот шаг работает нормально.
3) Добавить фильм, используя textField. Вот где глюк. Введенный фильм отлично записывается в базу данных, но также добавляется запись с нулевой ячейкой «имя».
4) Проблема возникает, только когда приложение переходит из таблицы VC в addMovie VC. Если вы продолжаете добавлять фильмы один раз в addMovieVC, никакие nils не добавляются в базу данных. Если вы вернетесь к таблице VC и снова перейдете к addMovie VC, первый добавленный фильм будет записан отлично, но будет сопровождаться еще одним фильмом с нулевым именем.

enter image description here

Вот мой addMovieVC:

class AddMovieViewController: UIViewController, UITextFieldDelegate
{
    var movies: [NSManagedObject] = []
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var button: UIButton!

func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        guard let text = textField.text else
        {
            textField.resignFirstResponder()
            return false
        }
        let trimmedText = text.trimmingCharacters(in: .whitespaces)
        if trimmedText != ""
        {
            self.save(trimmedText)
            textField.text = ""
        }
        textField.resignFirstResponder()
        return true
    }

    func save(_ name: String)
    {
        let coreDataStack = CoreDataStack()
        coreDataStack.movie.setValue(name, forKeyPath: "name")

        do
        {
            try coreDataStack.context.save()
            movies.append(coreDataStack.movie)
        } catch
        {
            print("Save error: \(error)")
        }
    }
}

И вот как выглядит мой стек основных данных:

struct CoreDataStack
{
    let context: NSManagedObjectContext
    let entity: NSEntityDescription
    let movie: NSManagedObject
    let fetchRequest: NSFetchRequest<NSManagedObject>

    init()
    {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        context = appDelegate.persistentContainer.viewContext
        entity = NSEntityDescription.entity(forEntityName: "Movie", in: context)!
        movie = NSManagedObject(entity: entity, insertInto: context)
        fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Movie")
        //let predicate = NSPredicate(format: "name != nil")
        //fetchRequest.predicate = predicate
        fetchRequest.includesPendingChanges = false
        //fetchRequest.returnsObjectsAsFaults = false
    }
}

Решения, закомментированные для класса CoreDataStack, не работают.
Любые идеи о том, как избавиться от ноль клеток? Любая помощь будет принята с благодарностью. Спасибо!

...