繁体   English   中英

Core-Data iPhone:找不到NSManagedObjectModel

[英]Core-Data iPhone: could not locate an NSManagedObjectModel

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

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

我做了以下事情:

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

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

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

#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''

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

好。

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

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

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

正如Aryeh在那篇文章中指出的那样:“简而言之,你正试图从尚未设置的objectContext中获取一个实体。因此,你的选择是在此视图加载之前将其设置为正确或在应用程序中的其他位置“。

在applicationDidFinishLaunching中:您正在执行以下操作:

rootViewController.managedObjectContext = self.managedObjectContext;

但我没有看到设置self.managedObjectContext的代码。 applicationDidFinishLaunching很早就被调用了。 您确定设置了托管对象上下文吗?

你有没有改变核心数据模型? 当应用程序的Core Data模型发生更改而不更改底层SQLite数据库时,该错误很常见,因此存储的数据和模型不同步。

尝试从模拟器或测试设备中完全删除您的应用程序,然后重新安装并再次尝试。

在我的开发过程中,我找不到我后来添加的实体。 什么对我有用:(基本上是一个理智小费:-)

每次更改数据模型时卸载应用程序!

Core Data在安装之间缓存数据模型,以确保完整性保持完整。 从模拟器/ iPhone中删除应用程序,以便能够测试您的更改。

PS:有谁知道如何自动完成?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM