核心数据 iPhone:找不到 NSManagedObjectModel [英] Core-Data iPhone: could not locate an NSManagedObjectModel

查看:20
本文介绍了核心数据 iPhone:找不到 NSManagedObjectModel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 Apple 的 CoreDataBooks 示例项目作为核心数据的学习辅助工具.

I am using Apple's CoreDataBooks sample project as a learning aid for core data.

我修改了应用程序,以便在应用程序加载时首先显示菜单页面 - 而不是 Books 表格视图 (RootViewController).

I modified the app so that when the app loads I show a menu page first - not the Books tableview (RootViewController).

我做了以下事情:

我在界面构建器中创建了一个菜单页面(只是一个带有按钮的视图)

I created a menu page in interface builder (just a view with a button on it)

CoreDataBooksAppDelegate.h 现在看起来像这样:

The CoreDataBooksAppDelegate.h now looks like this:

// for the menu
@class MenuViewController;

@interface CoreDataBooksAppDelegate : NSObject <UIApplicationDelegate> {

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 如下所示:

The CoreDataBooksAppDelegate.m looks like this:

#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 的其余部分保持不变.

The rest of CoreDataAppDelegete.m remains unchanged.

在 MenuViewController 中单击按钮时,会发生以下操作:

In the MenuViewController when the button is clicked, the following action takes place:

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

在 IB 中,我将 MainWindow.xib 更改为调用 MenuViewController 而不是 RootViewController.

In IB I changed the MainWindow.xib to call the MenuViewController rather than the RootViewController.

因此,应用程序加载并且菜单与按钮一起正确显示.单击按钮后,应用程序会在 RootViewController 的 viewDidLoad 内崩溃.

So, the app loads and the menu is displayed properly with the button. Upon clicking the button the application crashes inside of the RootViewController's 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");
}

在控制台中,我收到以下信息:

In the console I receive the following:

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

我已阅读有关此异常的信息,但我不知道解决该异常的正确步骤.

I have read about this exception but I do not know the proper steps to resolve it.

推荐答案

好的.

将以下代码放在 RootViewController 的 viewDidLoad 中可以消除错误:

Placing the following code inside of the RootViewController's viewDidLoad eliminates the error:

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

我在 SO 上发现了一个有类似问题的人:链接文本

I found someone with a similar problem here on SO: link text

正如 Aryeh 在该帖子中指出的那样:简而言之,您正在尝试从尚未设置的 objectContext 中获取实体.因此,您的选择是立即设置它或之前在应用程序的其他地方进行设置此视图加载."

As Aryeh pointed out in that post: "In short you are trying to fetch an entity from an objectContext that hadn't been set up yet. Your options therefore are to set it up right then or do elsewhere in the app before this view loads."

这篇关于核心数据 iPhone:找不到 NSManagedObjectModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆