문제

Apple의 Coredatabooks 샘플 프로젝트를 핵심 데이터의 학습 보조제로 사용하고 있습니다.

앱이로드되면 먼저 메뉴 페이지를 표시하도록 앱을 수정했습니다.

다음을 수행했습니다.

인터페이스 빌더에서 메뉴 페이지를 만들었습니다 (버튼이있는보기 만)

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를 변경하여 RootViewController 대신 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''

나는이 예외에 대해 읽었지만 그것을 해결하기위한 적절한 단계는 모른다.

도움이 되었습니까?

해결책

확인.

RootViewController의 ViewDidload 내부에 다음 코드를 배치하면 오류가 제거됩니다.

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

여기에서 비슷한 문제가있는 사람을 찾았습니다. 링크 텍스트

Aryeh가 그 게시물에서 지적했듯이 : "요컨대 아직 설정되지 않은 ObjectContext에서 엔티티를 가져 오려고합니다. 따라서 옵션은 바로 설정 하거나이보기로드 전에 앱의 다른 곳에서 수행해야합니다. . "

다른 팁

ApplicationDidFinishLaunching에서 : 다음을 수행하고 있습니다.

rootViewController.managedObjectContext = self.managedObjectContext;

그러나 self.managedObjectContext가 설정된 코드가 표시되지 않습니다. ApplicationDidFinishLaunching을 초기에 불립니다. 관리 된 객체 컨텍스트를 설정했다고 확신하십니까?

핵심 데이터 모델을 전혀 변경 했습니까? 이 오류는 앱의 핵심 데이터 모델이 기본 SQLITE 데이터베이스를 변경하지 않고 변경되므로 저장된 데이터와 모델이 동기화되지 않은 경우 일반적입니다.

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

개발 중에 나중에 추가 한 엔티티를 찾을 수 없었습니다. 나를 위해 일한 것 : (기본적으로 정신 팁 :-)

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

데이터 모델은 설치 간의 핵심 데이터로 캐시되어 무결성이 재치 상태를 유지하도록합니다. 시뮬레이터 / iPhone에서 앱을 삭제하여 변경 사항을 테스트 할 수 있습니다.

추신 : 누구든지 자동으로 그렇게하는 방법을 아는 사람이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top