Core-Data iPhone: не удалось найти NSManagedObjectModel

Я использую образец проекта Apple CoreDataBooks в качестве учебного пособия для основных данных.

Я изменил приложение, так что когда приложение загружается, я сначала показываю страницу меню, а не табличное представление Books (RootViewController).

Я сделал следующее:

Я создал страницу меню в построителе интерфейса (только представление с кнопкой на нем)

Теперь CoreDataBooksAppDelegate.h выглядит так:

// for the menu @class MenuViewController; @interface CoreDataBooksAppDelegate : NSObject  { NSManagedObjectModel *managedObjectModel; NSManagedObjectContext *managedObjectContext; NSPersistentStoreCoordinator *persistentStoreCoordinator; UIWindow *window; UINavigationController *navigationController; //for the menu MenuViewController *viewController; } - (IBAction)saveAction:sender; //for the menu @property (nonatomic, retain) IBOutlet MenuViewController *viewController; @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, readonly) NSString *applicationDocumentsDirectory; @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationController *navigationController; @end 

CoreDataBooksAppDelegate.m выглядит так:

 #import "CoreDataBooksAppDelegate.h" #import "RootViewController.h" // for the menu #import "MenuViewController.h" @implementation CoreDataBooksAppDelegate @synthesize window; @synthesize navigationController; // for the menu @synthesize viewController; #pragma mark - #pragma mark Application lifecycle - (void)applicationDidFinishLaunching:(UIApplication *)application { RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; rootViewController.managedObjectContext = self.managedObjectContext; // for the menu [window addSubview:viewController.view]; // Configure and show the window [window makeKeyAndVisible]; } 

Остальная часть CoreDataAppDelegete.m остается неизменной.

В MenuViewController при нажатии кнопки происходит следующее действие:

 RootViewController *modalViewController1 = [[[RootViewController alloc] initWithNibName:nil bundle:nil] autorelease]; [self presentModalViewController:modalViewController1 animated:YES]; 

В IB я изменил MainWindow.xib, чтобы вызвать MenuViewController, а не RootViewController.

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

Он падает прямо здесь:

 - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1 START viewDidLoad RootViewController"); self.title = @"Books"; // Set up the edit and add buttons. self.navigationItem.leftBarButtonItem = self.editButtonItem; NSLog(@"2 setup button viewDidLoad RootViewController"); // Configure the add button. UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addBook)]; self.navigationItem.rightBarButtonItem = addButton; [addButton release]; NSLog(@"3 viewDidLoad RootViewController"); NSError *error; // HERE IS THE CRASH SITE if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Does not reach this point in viewDidLoad RootViewController"); // Update to handle the error appropriately. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); // Fail } NSLog(@"END viewDidLoad RootViewController"); } 

В консоли я получаю следующее:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Book'' 

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

ОК.

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

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

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

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

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

 rootViewController.managedObjectContext = self.managedObjectContext; 

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

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

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

Во время моего развития я не смог найти объекты, которые я добавил позже. Что сработало для меня: (В принципе, здравый смысл 🙂

Удалите приложение каждый раз, когда вы меняете модель данных!

Модель данных кэшируется Core Data между установками, чтобы убедиться, что целостность остается в такте. Удалите приложение из симулятора / iPhone, чтобы проверить свои изменения.

PS: Кто-нибудь знает, как это сделать автоматически?

  • Предупреждать, когда не вызывается
  • iOS 5 не позволяет сохранять загруженные данные в папке «Документы»?
  • Приложение iOS: как очистить уведомления?
  • Сравнение двух NSDates и игнорирование временной составляющей
  • Замена на устаревший размерWithFont: в iOS 7?
  • iTunes Connect API
  • UIImage от CALayer - iPhone SDK
  • Метод sizeWithFont устарел. boundingRectWithSize возвращает неожиданное значение
  • Можно ли изменить цвет фона UIButtons?
  • Перемещение UIView (изображение и текст)
  • Как сделать кнопку перехвата надписью для перехвата событий?
  • Interesting Posts

    Как отключить AFP для использования SMB в Finder по умолчанию в Mac OS X 10.11 (El Capitan)?

    Должен ли я использовать службу Google Public DNS для своего рабочего стола?

    Как получить доступ к элементу управления формы для другой формы?

    Включить js-файл в шаблон Go

    Как предотвратить работу жесткого диска Windows 7?

    Как объединить кусты реестра Windows напрямую, не преобразовывая их в файл с промежуточным текстом?

    Преобразование формата JSON в формат CSV для MS Excel

    Можно ли увеличить только вертикальный размер фигуры в PowerPoint?

    как рассчитать движение телефона в вертикальном направлении от restа?

    Как создать trie в c #

    INSTALL_FAILED_UPDATE_INCOMPATIBLE, когда я пытаюсь установить скомпилированный .apk на устройство

    Включить обновление Windows для обновления всех компонентов?

    Что такое правило трех?

    Удаленная рабочая станция Linux за брандмауэром

    Как преобразовать строковую переменную, содержащую время в тип time_t в c ++?

    Давайте будем гением компьютера.