Значение исчезает из CoRe DaTa после загрузки основного TableViewController

Когда я загружаю основной список элементов TableView из CoreData, он отлично отображается:

let fetchRequest:NSFetchRequest<Identity> = Identity.fetchRequest()
        do
        {
            identities = try DatabaseController.getContext().fetch(fetchRequest)
            print("number of results: \(identities.count)")
            for identity in identities as [Identity]
            {
                print("\(identity.pName!) is \(identity.accuracy)% Robesper. Updeted \(identity.lastModified!).")
            }
        }
        catch
        {
            print("Error fetchRequest in ViewWillApper: \(error)")
        }

Удаление также работает хорошо, поэтому я создал новый NavigationController и представление для добавления нового объекта.

Чтобы проверить список и выяснить, в чем проблема (очевидно), я вывожу list.count . Потому что, когда я загружаю основной TableView со списком, новый ITEM не появляется в основном. Однако, когда я перезапускаю SIMULATOR, он показывает все элементы.

Итак 1. Создал новый объект.

  1. Вставил это в CoreData. введите здесь описание изображения
  2. Проверено. Это там! Ты можешь видеть...
> number of results: 3 Hello World is 99% Robesper. Updeted 2017-07-08
> 17:50:30 +0000. Sex is 99% Robesper. Updeted 2017-07-27 17:56:12
> +0000. test is 99% Robesper. Updeted 2017-07-27 18:03:28 +0000.
  1. Теперь -> Перейти к TableView -> Я проверил список в viewDidLoad и viewWillAppear.

  2. #P6# <блочная цитата>
    number of results viewDidLoad: 0
    viewWillAppear: 0
    number of results: 2
    Sex is 99% Robesper. Updeted 2017-07-27 17:56:12 +0000.
    Hello World is 99% Robesper. Updeted 2017-07-08 17:50:30 +0000.
    after fetch: 2
    
  3. Получено. Но теперь не хватает 1 НОВОГО значения!? Какая??? введите здесь описание изображения

  4. Перезапустите СИМУЛЯТОР. Теперь он показывает мне 3 предмета. Но когда я повторяю добавление элементов, это происходит снова. введите здесь описание изображения

ВОЗМОЖНО, из-за закрытия программы мы сохранили ее из AppDelegate?

func applicationWillTerminate(_ application: UIApplication)
{
    DatabaseController.saveContext()
}

Я вставил сохранение .saveContext() в ViewWillAppear, не сработало. ЧТО? Что я делаю не так, ребята? ПОЖАЛУЙСТА! СПАСИ МЕНЯ :D


person J A S K I E R    schedule 27.07.2017    source источник
comment
Пожалуйста, сохраните элемент в основную очередь   -  person Saurabh Jain    schedule 27.07.2017
comment
и перезагрузить таблицу в основную очередь   -  person Saurabh Jain    schedule 27.07.2017
comment
Пожалуйста, проверьте мой ответ.   -  person Saurabh Jain    schedule 31.07.2017
comment
Проверяю уже несколько дней... терпение)   -  person J A S K I E R    schedule 31.07.2017


Ответы (3)


Вы должны перезагрузить таблицу, когда представление появится в основной очереди после получения результата из основных данных.

DispatchQueue.main.async {
tableView.reloadData()
}
person Saurabh Jain    schedule 27.07.2017
comment
должно быть: self.tableView.reloadData() Однако не помогает =( - person J A S K I E R; 27.07.2017
comment
попробуйте вставить данные в БД в основную очередь. Я также столкнулся с той же проблемой @OleksandrZheliezniak - person Saurabh Jain; 27.07.2017

  1. Вы должны сохранить контекст, когда закончите вставку элемента.

  2. Представления не будут обновляться. Вам нужно обновить и вызвать reloadData в табличном представлении. Или используйте NSFetchedResultsController для подключения таблицы к запросу CoreData: https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller

person Lou Franco    schedule 27.07.2017
comment
Уже сделано... После заполнения всех полей: DatabaseController.saveContext() Также удалена информация о новом элементе из памяти: DatabaseController.getContext().delete(identity) tableView.reloadData() также пробовал в ViewDidAppear - person J A S K I E R; 27.07.2017

получить переменные процесса/настройки... затем...

Я думал, что я должен очистить временные переменные для хранения данных. Поэтому я использовал DatabaseController.getContext().delete(identity), чтобы содержать его в чистоте. Однако в SWIFT этого делать не нужно, потому что за вас это могут сделать МЕНЕДЖЕРЫ. Все, что вам нужно - SAVE'n'GO, чтобы перезагрузить таблицу / список данных. Простое комментирование решило все проблемы)

//DatabaseController.getContext().delete(identity)
DatabaseController.saveContext()
person J A S K I E R    schedule 24.09.2017