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: Кто-нибудь знает, как это сделать автоматически?

  • AppDelegate, rootViewController и presentViewController
  • objective C: Как вы можете повернуть текст для UIButton и UILabel?
  • Как предоставить пространство между двумя ячейками в виде таблицы?
  • NSMutableArray addObject не работает
  • Добавление изображений в кнопки UIActionSheet, как в UIDocumentInteractionController
  • Как я могу программно приостановить NSTimer?
  • Позиционирование MKMapView для одновременного отображения нескольких аннотаций
  • Свойство запроса Parse NSURL
  • Как установить приложение Cocoa в качестве браузера по умолчанию?
  • Получите данные Exif от UIImage - UIImagePickerController
  • UIImage imageNamed требует pathForResource?
  • Interesting Posts

    Захват вывода из exec

    Приложения иногда не отображаются на системном трее

    Будет ли используемый оператор откат транзакции базы данных при возникновении ошибки?

    Как получить сообщение об ошибке при сбое openstream

    NSData для UIImage

    Почему ubuntu выключается так быстро по сравнению с Windows 7

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

    Дублирование столбца таблицы с сохранением отдельной нумерации (в текстовом редакторе, например: MS Word, Libre Office Writer и т. Д.)

    WCF: System.Net.SocketException – разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)

    Как обрабатывать запрос Ajax JQUERY POST с помощью WCF-хоста

    Проверка типа объекта Objective-C?

    tkinter: использование полос прокрутки на canvasе

    Должен ли я использовать умножение или деление?

    Как получить файл apk с устройства Android?

    Изменение по умолчанию app.config во время выполнения

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