2009-10-27 4 views
35

코어 데이터의 학습 지원으로 Apple의 CoreDataBooks 샘플 프로젝트를 사용하고 있습니다.Core-Data iPhone : NSManagedObjectModel을 찾을 수 없습니다.

응용 프로그램이로드 될 때 Books 페이지 뷰 (RootViewController)가 아닌 메뉴 페이지가 먼저 표시되도록 응용 프로그램을 수정했습니다.

내가 수행 한 다음

// 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.h 지금과 같이 보입니다에서 메뉴 페이지를 만들었

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의 나머지 부분은 변경되지 않습니다.

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

는 IB에서 나는 MenuViewController보다는 RootViewController를 호출 MainWindow.xib에 변경 : 버튼을 클릭 할 때 MenuViewController에서

다음 작업이 수행됩니다.

그래서 앱이로드되고 버튼이 메뉴에 제대로 표시됩니다. 버튼을 클릭하면 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'' 

.

답변

87

확인.내가 지금 여기에 비슷한 문제를 가진 사람을 발견

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

: Aryeh은 해당 게시물에서 지적 link text

"에서 RootViewController의 viewDidLoad에 내부에 다음 코드를 배치

오류를 제거 즉, 아직 설정되지 않은 objectContext에서 엔티티를 가져 오려고하면, 뷰를로드하기 전에 옵션을 바로 설정하거나 앱의 다른 위치에서 수행해야합니다. "

3

코어 데이터 모델을 변경 했습니까? 이 오류는 응용 프로그램의 핵심 데이터 모델이 기본 SQLite 데이터베이스를 변경하지 않고 변경 될 때 일반적으로 발생하므로 저장된 데이터와 모델이 동기화되지 않습니다.

시뮬레이터 나 테스트 장치에서 앱을 완전히 제거한 다음 다시 설치하고 다시 시도해보십시오. 아래 applicationDidFinishLaunching에서

+0

안녕하세요. 지금까지 시뮬레이터의 콘텐츠 및 설정을 재설정하기까지했습니다. Xcode에서는 캐시를 비우고 모든 대상을 정리했습니다. 오류 : 'NSInternalInconsistencyException', 이유 : '+ entityForName : 엔티티 이름'Book '에 대한 NSManagedObjectModel을 찾을 수 없습니다. 여전히 발생합니다. 도와 줘서 고마워 Tim. – CraigH

+1

디버거에서 프로그램을 단계별로 실행하십시오 - 예외를 얻을 때'managedObjectModel'의 값은 무엇입니까? 'managedObjectContext'? – Tim

+0

안녕하세요. 좋아, 내가 managedObjectModel 보이지 않는 디버거 - 그러나 managedObjectContext에 대한 값이 null입니다 RootViewController viewDidLoad - 잘못된 값이 있어야합니다. 앱의 수정되지 않은 버전에서 managedObjectContext의 값은 viewDidLoad에서 0x3e2ce60입니다. 디버거가 다음 행에서 중지됩니다. NSEntityDescription * entity = [NSEntityDescription entityForName : @ManagedObjectContext : managedObjectContext]의 "Book"; 내부 - (NSFetchedResultsController *) RootViewController의 fetchedResultsController 메소드입니다. – CraigH

4

: 다음과 같은 일을하는지 :

rootViewController.managedObjectContext = self.managedObjectContext; 

하지만 self.managedObjectContext가 설치되는 코드가 표시되지 않습니다. applicationDidFinishLaunching은 꽤 일찍 호출됩니다. 관리 대상 객체 컨텍스트를 설정 하시겠습니까?

+0

안녕하세요. 예, 관리 대상 객체 컨텍스트가 설정되었습니다 (Apple의 CoreDataBooks 샘플이므로 나머지 코드는 그대로 둡니다). applicationDidFinishLaunching에서 줄 바꾸기 : [window addSubview : viewController.view]; [window addSubview : [navigationController view]]; (위의 내 질문에 게시 참조) 다음 응용 프로그램을 즉시 RootViewController로드하고 잘 실행되고 managedObjectContext nil 아닙니다. 어쨌든 applicationDidFinishLaunching에서 managedObjectContext는 값을 갖습니다. 감사합니다. . – CraigH

0

내 개발 과정에서 나중에 추가 한 엔티티를 찾을 수 없습니다. 나에게 도움이 된 기능 : (기본적으로 온전한 팁 :-)

데이터 모델을 변경할 때마다 앱을 제거하십시오!

데이터 모델은 설치간에 핵심 데이터에 의해 캐시되어 무결성이 유지됩니다. 변경 사항을 테스트하려면 시뮬레이터/iPhone에서 응용 프로그램을 삭제하십시오.

추신 : 누구나 자동으로 수행하는 방법을 알고 있습니까?

관련 문제