Базовые данные iPhone: не мог определить местоположение NSManagedObjectModel

Ваш случай очень прост и поэтому не нуждается в МОК (Инверсия Управления) контейнер как Spring. С другой стороны, когда Вы "программа к интерфейсам, не реализации" (который является хорошей практикой в ООП), у Вас может быть код как это:

IService myService;
// ...
public void doSomething() {
  myService.fetchData();
}

(отмечают, что тип myService является IService - интерфейс, не конкретная реализация). Теперь может быть удобно позволить Вашему контейнеру МОК автоматически обеспечить корректный конкретный экземпляр IService во время инициализации - когда у Вас есть много интерфейсов и много реализаций, это может быть громоздким, чтобы сделать это вручную. Основные преимущества контейнера МОК (платформа внедрения зависимости):

  • Внешняя конфигурация отображения между интерфейсами и их конкретных реализаций
  • контейнер МОК обрабатывает некоторые щекотливые вопросы как разрешение сложных графов зависимостей, время жизни руководящего компонента и т.д.
  • , Вы экономите время кодирования, потому что Вы обеспечиваете отображения декларативно, не в процессуальном кодексе
  • Инверсия принципа Управления допускает легкое поблочное тестирование, потому что можно заменить реальные реализации поддельными (как замена базы данных SQL с в оперативной памяти)
35
задан ROMANIA_engineer 14 January 2018 в 19:57
поделиться

3 ответа

Хорошо.

Размещение следующего кода внутри viewDidLoad RootViewController устраняет ошибку:

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSLog(@"After managedObjectContext: %@",  managedObjectContext);
}

Я нашел человека с похожей проблемой здесь, на SO: текст ссылки

Как отметил Арье в этом посте: «Короче говоря, вы пытаетесь получить сущность из objectContext, который еще не был настроен. Таким образом, вы можете настроить его прямо сейчас или сделать в другом месте приложения до загрузки этого представления. . "

87
ответ дан 27 November 2019 в 06:38
поделиться

Вы вообще меняли модель Core Data? Эта ошибка часто встречается, когда модель Core Data для приложения изменяется без изменения базовой базы данных SQLite, поэтому сохраненные данные и модель не синхронизированы.

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

3
ответ дан 27 November 2019 в 06:38
поделиться

В applicationDidFinishLaunching: вы делаете следующее:

rootViewController.managedObjectContext = self.managedObjectContext;

Но я не вижу кода, в котором настраивается self.managedObjectContext. applicationDidFinishLaunching вызывается довольно рано. Вы уверены, что настроили контекст управляемого объекта?

4
ответ дан 27 November 2019 в 06:38
поделиться