2016-08-17 2 views
1

У меня есть приложение с основными данными с одной моделью, состоящей из нескольких объектов. Для целей этого вопроса давайте назовем модель «Человек» и будем иметь сущности «имя» (строка), «возраст» (int), «занятие» (строка) и «описание» (строка).Основные данные - частичная потеря данных при повторном запуске приложения

В качестве примера я могу добавить нового человека. Я задал их имя, возраст, профессию и описание. Я подтверждаю, что контекст обновлен, проверяя содержимое userInfo NSManagedObjectContextObjectsDidChangeNotification. Затем контекст сохраняется и сохраняется на диске (подтверждается как протоколированием, так и запросом SQLite db).

На данный момент я могу редактировать любые мои объекты Person, и все сущности могут быть изменены, добавлены, удалены и т. Д., И все изменения подтверждены, чтобы изменить контекст с помощью NSManagedObjectContextObjectsDidChangeNotification и подтвердили, что они сохраняются на диске посредством ведения журнала и запрос SQLite - все работает так, как ожидалось.

Тем не менее, «занятие» и «описание» не сохраняются после перезапуска приложения. Они не установлены как transient (однако они являются «необязательными»), и основной контекст сохраняется (иногда несколько раз) после их установки. Более того, если я уйду из приложения, прежде чем снова его открыть, я могу запросить SQLite db и подтвердить, что изменения все еще существуют на диске.

Когда приложение будет открыто, я могу подтвердить, что все на диске так же, как и когда я ушел. Однако, когда я инициализировал основные данные в своем делете делегата, NSManagedObjectContextObjectsDidChangeNotification уведомляет меня, что что-то изменилось. По какой-то причине «оккупация» и «описание» исчезли. Они не были установлены в нуль, они были установлены в строки с нулевой длиной. Поэтому в следующий раз, когда что-то происходит, что запускает сохранение, «занятие» и «описание» устанавливаются в строки нулевой длины и исчезают. Все это происходит только при запуске - я не имею доступа к контроллеру представления или к чему-либо еще, что даже запросы для этих конкретных полей. Тем не менее, я показываю контроллер представления, который требует запроса на выборку, который заполняет UITableView, который отображает объекты «Люди», хотя он не отображает конкретно ни один из рассматриваемых объектов.

Существует легкая модель переноса данных ядра от Person 1 к Person 2, однако при переключении на Person 1 эта проблема сохраняется, что приводит меня к мысли, что проблема не связана с миграцией.

Я прошу дать рекомендации о том, где начать устранение этой проблемы. Я не могу отправить код - я понятия не имею, где в моем приложении проблема возникает. Я попытался устранить неполадки, насколько это возможно, с подтверждением того, когда изменения происходят в контексте и как это сравнивается с тем, что находится на диске, я просто не знаю, куда идти отсюда. Я не знаю, почему эти сущности (и только некоторые из них) исчезают. Как кто-то начнет устранять эту проблему? Любая помощь приветствуется.

+0

в вашей модели объекта, управляемой человеком, создайте настраиваемые средства настройки для проблемных свойств и добавьте точки останова.Если они действительно изменяются, когда ваше приложение перезапускается, вы должны увидеть, что это происходит через эти методы, а трассировка стека даст вам подсказку о том, кто его вызывает. – Rog

+1

Также, что произойдет, если вы переименуете свойства на что-то другое? Попробуйте 'оккупация1' и' description1' и посмотрите, не исчезла ли проблема, а затем оттуда. Я уверен, что вы не должны использовать 'description' как имя атрибута, потому что оно переопределяет' описание', реализованное 'NSObject'. [edit] Да, смотрите здесь, в документации говорится, что вам не рекомендуется переопределять «описание», поскольку результаты могут быть непредсказуемыми. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/LifeofaManagedObject.html# // apple_ref/doc/uid/TP40001075-CH16-SW1 – Rog

+0

В рассматриваемой сущности переопределить 'validateValue: forKey: error' и добавить условный код, который регистрируется, когда' value' является пустой строкой, а 'key' является одним из неприятные поля. Теперь поставьте точку останова на строку ведения журнала, и вы сможете увидеть через обратную линию точно, кто устанавливает поле в пустую строку. – Avi

ответ

0

Благодаря руководству @Rog и @Avi я смог как настроить настраиваемые сеттеры для рассматриваемых свойств, так и переопределить validateValue:forKey:error и установить точки останова в каждом. Отсюда я смог увидеть вызывающие методы и правильно диагностировать проблему.

Фактическая проблема заключалась в том, что я не понял, что initWithEntity:insertIntoManagedObjectContext: вызывается для каждого объекта, когда Core Data инициализируется, где я находился под впечатлением, что он будет вызываться только при первоначальном создании объекта (один раз и только один раз). Проблемный код был в initWithEntity:insertIntoManagedObjectContext:.

Благодарим за помощь!

Смежные вопросы