2011-07-15 11 views
4

こんにちは コア・データ・アプリケーションは、

- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 

    } 
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext; 
} 



- (NSManagedObjectModel *)managedObjectModel { 

    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"momd"]; 
    managedObjectModel= [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
    NSLog(@"%@", modelURL); 
    return managedObjectModel; 
} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 


    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"TouristGuide.sqlite"]; 


    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    // If the expected store doesn't exist, copy the default store. 
    if (![fileManager fileExistsAtPath:storePath]) { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"TouristGuide" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
     } 
    } 

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 


    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];  
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 


    NSError *error; 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    }  


    return persistentStoreCoordinator; 
} 

..私は、デバイスの私のコアデータアプリケーションをテストしていたが、それはiphoneでクラッシュし、simulator.Hereに細かい作業は私のコードでされているデバイスのログがあるiphoneデバイスにクラッシュします行で例外を示す:

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

例外がcannot create nspersistancecordinator with a nil modelあり、2番目はcannot find Entity 'City'です。

どうすればこの問題を解決できますか?

クラッシュログ

0x352d1de0 -[NSPersistentStoreCoordinator initWithManagedObjectModel:] + 252 10 TouristGuide     
0x0000358e -[TouristGuideAppDelegate persistentStoreCoordinator] (TouristGuideAppDelegate.m:176) 11 TouristGuide     
0x0000310e -[TouristGuideAppDelegate managedObjectContext] (TouristGuideAppDelegate.m:124) 12 TouristGuide  
0x000041f6 -[CityViewController viewDidLoad] (CityViewController.m:43) 
+0

クラッシュログには何が表示されますか? –

+0

check編集の回答 – iProgrammer

+0

それは2つの例外を与えています – iProgrammer

答えて

18

製品メニュー(Xcodeの4)に移動し、「クリーンビルドフォルダ」を行う...その後、オプションキーをオフにしましょう、と「クリーン行い、オプションキーを押しながら"...

今do 製品メニュー>すべてをコーシャにしてください。

最後に、プロジェクトビューアの左側のパネルに移動し、プロジェクト全体を表すアイコンをクリックします。メインパネルの[ターゲット]に表示されるウィンドウで、アプリをクリックします。 「Build Phases」をクリックし、「Bundle Resourcesをコピー」を展開します。 TouristGuide.xcdatamodeldファイルがあることを確認してください。次に、 "Link with Binary with Libraries"を展開し、 "CoreData.framework"がそこにあることを確認します(既存のプロジェクトにコアデータを追加した場合、コアデータプロジェクトとして開始しなかった可能性がありますそこ)。次に、「ソースのコンパイル」を展開し、もちろん、すべてのモデルクラスがそこにあることを再確認してください(つまり、NSManagedObjectカスタムサブクラス)。

これらのモデルクラスといえば、TouristGuide.xcdatamodeldをクリックし、 "Default"設定をクリックしてください。 "クラス"列の "NSManagedObject"と言うクラスがカスタムクラスを持たないことを確認し、カスタムクラスをリストする場合は、それらに相当する.hと.mファイルがあることを確認してください。

10対1というのは、モデルファイル自体とは関係があります。一度、モデルファイルのフルパスを変更しました(/Users/You/Documents/Developer/MyApp/MyModel.xcdatamodeld/MyModel.xcdatamodel)。 MyModel.xcdatamodeldは、フォルダではなく「パッケージ」ファイルであるため、変更した後、元に戻す方法を理解できませんでした。確かに、ファインダーでは、 "Show Package Contents ..."を実行することができますが、ファイルの場所を選択するためのXCodeのダイアログボックスは、にパッケージの内容を拒否しました!だから、.xcdatamodeldファイル内にある.xcdatamodelファイルを再選択することができませんでした。モデルファイル全体を最初から完全に作り直さなければならなかったので、それは大きな苦痛でした。多分それを行う方法がありますが、私はそれを理解できませんでした。

また、最後の2つのトリック。

まず最後のトリックは、念のため、プロジェクトのバックアップでこれを試してみてください、それは私が行き詰まったときに私のために働いていた:これからのコードを変更:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"momd"]; 

をこれに:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"mom"]; 

... "momd"を "mom"に変更します。

次に、デバイスまたはシミュレータからアプリケーションを削除します。「ビルドフォルダをクリーン」「クリーン」にして、プロジェクトを再構築して再実行します。それはあなたにエラーを与えるかもしれませんが、そうではありません。その後、それを "momd"に戻して、すべてのステップをやり直してください。これを変更すると、XCodeが「Clean Build Folder」を実行してアプリを再インストールするときよりも多くのものを削除する可能性があります。そうすることで、元に戻ったときに新しい "momd"ファイルが作成されます。

第二に、最後のトリック:

それはまた、単に幸運のために、あなたのヘッダーに#IMPORTに越したことはありません。 :D

これが役立ちます。誰かが私にこのようなことを話してくれたら、それは私に多くの時間を節約していたはずです。

+1

'mom'ファイルはバージョン管理されていないファイルで、' momd'はバージョン管理されたファイルです。 – TechZen

+0

修正; .momdには1つまたは複数の.momファイルが含まれています。しかし、私の望みは、ファイルタイプを間違ったものに一時的に変更すると、Xcodeを再構築しなければならないと「混乱させる」可能性があります。デバイスを削除することが役に立たない場合、デバイスが刑務所に壊れている場合やリリースをビルドしていない場合など、私は聞いたことがないので、最後のタイプのものの種類)。 – CommaToast

+0

「バンドルリソースのコピー」を展開しました。それにTouristGuide.xcdatamodeldファイルを持っていない。これを追加できますか? – iProgrammer

1

エラーは、実際にはself.managedObjectModelプロパティの値がnilのために発生します。 managedObjectModelがロードされているメソッドを見てください。それがあなたの問題の原因です。

Xcodeでは、シミュレータまたはデバイスの開発ビルドから以前のバージョンのファイルが削除されないことがあります。解決策は、デバイスのアプリケーション全体を手動で削除し、Xcodeで最初から再構築するようにすることです。

+0

私はターゲットをクリーニングしてアプリを再インストールしようとしましたが、私たちは働いていません – iProgrammer

+0

手動で、つまりXcodeを使用していませんが、アプリのアイコンをタップして保持して、デバイスからアプリを削除してから再インストールしてください。 – TechZen

関連する問題