2011-07-15 45 views
4

你好,我在設備測試我的核心數據的應用程序,但它是在iphone崩潰和simulator.Here做工精細是我的代碼..核心數據應用在iPhone設備崩潰

- (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; 
} 

設備日誌表示行例外:

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

例外的是cannot create nspersistancecordinator with a nil model和第二是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

查看編輯答案 – iProgrammer

+0

它給出2例外 – iProgrammer

回答

18

按住Option鍵,進入產品菜單(的Xcode 4),做「乾淨生成文件夾」 ......然後讓關閉該選項鍵,做「乾淨「...

現在做產品菜單>分析並確保一切都是猶太教。

最後轉到項目查看器的左側面板,然後單擊代表整個項目的圖標。在主面板中出現的窗口中的「目標」下,單擊您的應用程序。現在點擊「Build Phases」並展開「Copy Bundle Resources」。確保您的TouristGuide.xcdatamodeld文件在那裏。接下來,展開「與庫鏈接二進制文件」並確保「CoreData.framework」在那裏(如果您將Core Data添加到一個現有項目並不是作爲核心數據項目開始的,那麼機會是,它不在那裏)。接下來,展開「編譯源代碼」,當然,仔細檢查你的所有模型類是否在那裏(你知道NSManagedObject自定義子類)。

說到這些模型類...現在點擊您的TouristGuide.xcdatamodeld並單擊「默認」配置。確保任何在「Class」列中聲明「NSManagedObject」的類沒有自定義類,並且如果它們列出了自定義類,請確保具有與之相對應的等效命名的.h和.m文件。

10對1這與您的模型文件本身有關。有一次,我改變了我的模型文件的完整路徑(它應該是/Users/You/Documents/Developer/MyApp/MyModel.xcdatamodeld/MyModel.xcdatamodel)。一旦我改變了它,我無法弄清楚如何改回它,因爲MyModel.xcdatamodeld是一個「包」文件,而不是一個文件夾。當然,在查找器中,您可以執行「顯示軟件包內容...」,但XCode用於提取文件位置的對話框拒絕將導航到軟件包內容!所以我無法重新選擇駐留在.xcdatamodeld文件中的.xcdatamodel文件!我不得不從頭開始重新創建我的整個模型文件,這是一個巨大的痛苦。也許有辦法做到這一點,但我無法弄清楚。

另外,兩個最後的技巧。

首先最後絕招,試試這個在您以防萬一項目的備份,但它的工作對我來說,當我卡住了:從此改變你的代碼:

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

這樣:

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

...將「媽媽」改爲「媽媽」。

然後從設備或模擬器中刪除應用程序,「清潔生成文件夾」,「乾淨」,然後重建並重新運行項目。它可能會給你錯誤,它可能不會。之後,然後將其更改回「媽媽」並重做所有這些步驟。改變這可能會使XCode刪除更多的東西,而不是當您執行「Clean Build Folder」時重新安裝應用程序。這樣,當你切換回來時,它會創建一個新的「媽媽」文件。

倒數第二招:

它也絕不會傷害你的頭向#IMPORT,只是運氣好。 :D

希望這會有所幫助。如果有人會在開始的時候告訴我這些東西,那會爲我節省很多時間。

+1

「媽媽」文件是一個未版本控制的文件,「媽媽」是一個版本。 – TechZen

+0

正確; .momd包含一個或多個.mom文件,對嗎?但我的希望是,暫時將文件類型改爲錯誤的文件類型可能會「混淆」Xcode,認爲它需要重新構建它,如果在構建過程中遇到問題,這可能會有所幫助。最後一種類型的東西,如果刪除設備沒有幫助,因爲我聽說過它不會這樣做的時間(例如,如果設備被監禁或者如果你沒有構建發佈版本)。 – CommaToast

+0

我擴大了「複製軟件包資源」。並沒有TouristGuide.xcdatamodeld文件中..如何添加此 – iProgrammer

1

該錯誤實際上是由self.managedObjectModel屬性具有零值造成的。查看加載managedObjectModel的方法。這是你問題的根源。

有時,Xcode不會從模擬器或設備上的開發版本中刪除以前版本的文件。解決方案是手動刪除整個設備的應用程序,並讓Xcode從頭開始重建它。

+0

我試圖清洗目標,並重新安裝應用程序,但它我們不工作 – iProgrammer

+0

手動即不使用Xcode,但點擊並按住應用程序圖標,從設備上刪除應用程序,然後重新安裝。 – TechZen