Проблема с удалением сущности из другого ViewController в CoreData - PullRequest
0 голосов
/ 18 февраля 2020

человек. Я учусь работать с CoreData и у меня есть вопрос. У меня есть «WordArrayEntity», которые имеют отношение oneToMany с «WordEntity» и правило удаления Nulify. Поэтому сначала, когда мое приложение начинает получать информацию из моего CoreData в специальный массив

    var wordEntities:[[WordEntity]] = []

После этого мой tableView получает атрибут, который ему нужен. Как я понимаю, я могу удалить объекты этим методом

    context.delete(wordEntity)

все работает нормально, когда я делаю это на моем tableView. Но когда я перехожу в редактор ViewController и пытаюсь добавить новую сущность или удалить предыдущую, ничего не происходит. Это мой код для перехода к следующему контроллеру представления

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    if let controller = self.storyboard?.instantiateViewController(withIdentifier: "ShowWordVC") as? ShowWordVC {
        controller.word = SingleTonForEntities.shared.wordEntities[indexPath.section][indexPath.row]
        controller.wordIndex = indexPath.row
        self.present(controller, animated: true)
    }
}

Это мой метод удаления слова, который отлично работает в tableView

    func deleteWordFromVocabulary(word: WordEntity,indexPath: Int) {
    var wordStartsFromLetter = false
    if let firstCharacter:Character = word.englishWord?.first {
        var index = 0
        for array in wordEntities {
            if SingleTon.shared.sectionName[index].lowercased() == firstCharacter.lowercased() {
                var newArray = array
                context.delete(word)
                newArray.remove(at: indexPath)
                wordEntities[index] = newArray
                wordStartsFromLetter = true
            }
            index += 1
        }
    }

    if wordStartsFromLetter == false {
        var newArray = wordEntities[26]
        context.delete(word)
        newArray.remove(at: indexPath)
        wordEntities[26] = newArray
    }

    saveContext()
}

Когда я пытаюсь сохранить слово после редактирования или новый у меня следующий код

@IBAction func saveButtonIsPressed(_ sender: UIButton) {
    keyboardDissapears()
    guard let englishWord = self.englishWordTextField.text,
        !englishWord.isEmpty,
        let wordImage = addedImageView.image,
        let belarusianWord = self.belarusianWordTextField.text,
        !belarusianWord.isEmpty,
        let englishDefinition = self.englishDefinitionTextView.text,
        !englishDefinition.isEmpty,
        let belarusianDefinition = self.belarusianDefinitionTextView.text,
        !belarusianDefinition.isEmpty else {
            createAndShowAlert()
            return
        }
    if editModeIsActivated == true {
        if let wordToDelete = word, let wordIndex = wordIndex {
            SingleTonForEntities.shared.deleteWordFromVocabulary(word: wordToDelete, indexPath: wordIndex)
        }
    }


    word!.englishDefinition = englishDefinition
    word!.belarusianDefinition = belarusianDefinition
    word!.englishWord = englishWord
    word!.belarusianWord = belarusianWord
    let data = wordImage.pngData()
    word!.wordImage = data

    SingleTonForEntities.shared.addNewWordToVocabulary(word: self.word)
    self.createAndShowDoneProgressAlert()

}

сначала я проверяю, не заполнены ли мои поля. Если они не пусты, и мы находимся в режиме редактирования, я удаляю «WordEntity» из нашего контекста, а затем из нашего массива. А потом я пытаюсь сохранить новое слово и добавить его в контекст с помощью этого метода

    func addNewWordToVocabulary(word: WordEntity!) {
    var wordStartsFromLetter = false
    word.englishWord = word.englishWord!.trimmingCharacters(in: .whitespacesAndNewlines)
    if let firstCharacter:Character = word.englishWord?.first {
        var index = 0
        for array in wordEntities {
            if SingleTon.shared.sectionName[index].lowercased() == firstCharacter.lowercased() {
                var newArray = array
                newArray.append(word)
                for element in wordEntitesArray {
                    if element.arrayName == SingleTon.shared.sectionName[index].lowercased() {
                        element.addToWordEntities(word)
                    }
                }
                wordEntities[index] = newArray
                wordStartsFromLetter = true
            }
            index += 1
        }
    }
    if wordStartsFromLetter == false {
        var newArray = wordEntities[26]
        newArray.append(word)
        wordEntities[26] = newArray
    }
    saveContext()
}

И возникает вопрос. Что я делаю неправильно? Когда я пытаюсь добавить новое слово в словарь - мое приложение вылетает. Но когда я в режиме редактирования и после него добавляю новое слово в словарь - он просто возвращает пустой tableViewCell. Я новичок в CoreData и работаю с ним около недели, но я был бы рад узнать, что я делаю неправильно и что мне следует делать в таких ситуациях.

PS С UserDefaults все работало хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...