2009-10-27 12 views
35

コアデータの学習支援として、AppleのCoreDataBooksサンプルプロジェクトを使用しています。Core-Data iPhone:NSManagedObjectModelを見つけることができません

アプリが読み込まれたときにブックのテーブルビュー(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で

ボタンがクリックされたときに、次のアクションが行われます:IBで

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

私はむしろRootViewControllerよりMenuViewControllerを呼び出すようにMainWindow.xibを変更しました。

アプリが読み込まれ、メニューがボタンで正しく表示されます。ボタンをクリックすると、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

Aryehがそのポストに指摘したようにlink text

:「ではRootViewControllerののviewDidLoadの内側に次のコードを配置

がエラーを排除します。

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

私はここSO上で同様の問題を持つ人を見つけましたつまり、まだ設定されていないobjectContextからエンティティを取得しようとしているのです。そのため、このビューをロードする前に、そのオプションを設定するか、アプリ内の別の場所で行うことができます。

3

コアデータモデルをまったく変更しましたか?このエラーは、アプリケーションのコアデータモデルが変更され、基礎となるSQLiteデータベースも変更されないため、格納されたデータとモデルが同期していない場合によく発生します。

あなたのアプリをシミュレータまたはテストデバイスから完全に削除してから、再インストールしてもう一度試してみてください。 applicationDidFinishLaunchingで

+0

こんにちは。私はこれまで、シミュレータのコンテンツと設定をリセットするようになった。 Xcodeでは、キャッシュを空にしてすべてのターゲットをクリーニングしました。 エラー: 'NSInternalInconsistencyException'、理由: '+ entityForName:エンティティ名' Book 'のNSManagedObjectModelが見つかりませんでした。 がまだ発生しています。助けてくれてありがとうTim。 – CraigH

+1

デバッガでプログラムをステップ実行します。例外を取得したときに 'managedObjectModel'の値は何ですか? 'managedObjectContext'? – Tim

+0

こんにちは。さて、私はmanagedObjectModelは表示されませんが、RootViewController viewDidLoadではmanagedObjectContextの値がnullであることがわかります。間違っていて、そこに値があるはずです。変更されていないバージョンのアプリケーションでは、managedObjectContextの値はviewDidLoadの0x3e2ce60です。 このデバッガは次の行で停止します。 NSEntityDescription * entity = [NSEntityDescription entityForName:@ManagedObjectContext:managedObjectContext]の "Book"; RootViewControllerのinside - (NSFetchedResultsController *)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からAppを削除します。

PS:誰でも自動的にその方法を知っていますか?