2011-06-15 52 views
1

我在我的應用程序有一個奇怪的錯誤,它說:未能找到NSManagedObjectModel的實體名稱 - 通用的應用程序

*終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」,原因是:「+ entityForName:可能沒有找到一個NSManagedObjectModel的實體名稱'書'

我知道,有「無法找到一個NSManagedObjectModel爲實體名稱」的頂點在這裏和在網頁上,但奇怪的是,它是一個通用的應用程序和iPhone應用程序總是正常工作,只有iPad應用程序在啓動時崩潰。

在主AppDelegate中,有兩個methodes而在iPhone/iPad上的AppDelegate我打電話這段代碼applicationdidFinishLaunchingWithOptions像這樣的代碼:

if ([self modelExists] == NO) { 
    [self buildModel]; 
} 

所以它以同樣的方式我稱之爲代碼,但iPad版本崩潰,iPhone版本沒有。

唯一的不同是iPhone版本使用TabBarContoller(在IB中設置),iPad版本使用單個viewController(也在IB中設置)。

它發生在模擬器和設備上。

我不知道該怎麼做。希望你能明白我的意思...... THX很多 塞巴斯蒂安

編輯: 我發現,當我運行的iPhone版本,在主AppDelegate中的代碼被稱爲理所應當的,但是當我運行iPad版本主AppDelegate的NONE代碼被調用,所以沒有創建managedObject,這就是錯誤的原因。但爲什麼沒有代碼在主AppDelegate中運行? THX

EDIT2: 現在這是我的主要的AppDelegate代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
if ([self modelExists] == NO) { // Checks if the model is allready filled up or not. (Uses CoreData stuff of course) 
// iPhone Version is fine here. iPad Version crashes. 
    [self buildModel]; 
}  

[self buildInterface]; // Called in the iPhone or iPad AppDelegate to make the window visible etc. 
return YES; 
} 

所以didFinishLaunchingWithOptions是所謂的iPhone和iPad版。 iPad版本無論如何都不會運行coredata的東西,而iphone版本確實會運行coredata的東西。任何想法可能是錯的?謝謝!

+1

iPad有核心數據中存儲髒或老版本數據的可能性?即您是否嘗試從iPad中刪除應用程序並重新安裝以驗證核心數據是否乾淨? – Rob 2011-06-15 02:08:07

+0

Thx,但我刪除了幾次應用程序,並重置模擬器,當然做了一個乾淨的建... – wolfrevo 2011-06-15 07:09:16

回答

1

我發現我的問題。真是奇怪......

這是 「modelExists」

- (BOOL)modelExists { 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
request.entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:__managedObjectContext]; //<- Crashed. Had to change it to self.managedObjectContext 
request.predicate = nil; 
NSError *error = nil; 
... 

塞巴斯蒂安

1

也許應用程序委託沒有運行任何代碼,如果它只是沒有設置爲應用程序的委託。

在您的主要NIB中查找iPad版本,並確保將「AppName App Delegate」設置爲該NIB文件所有者的代表。

+0

模型文件位於主目錄,所以在ipad/iphone文件夾頂部的一個級別... ...我有新的信息。請看看我編輯的問題。謝謝! – wolfrevo 2011-06-15 07:30:50

+0

我編輯了我的答案。 – gcamp 2011-06-15 15:02:18

+0

Thx,AppDelegate_iPad設置爲文件所有者的委託,因爲它在iPhone主要的NIB中設置。一切都以與iPhone側相同的方式進行連接。 :| – wolfrevo 2011-06-15 23:06:44

0

的我有同樣問題的代碼。我的應用程序在開發過程中一直工作得很好,然後突然它發生了這個錯誤。將managedObjContect更改爲[self managedObjectContext]解決了問題。

我想知道爲什麼....任何專家在那裏?爲什麼原始代碼能夠將對managedObjectContext的調用解析爲成員函數的實現....並且突然不能?就我所知,這個代碼沒有其他靜態實現可見。

感謝張貼這個,節省了我許多小時的雜亂。

0

在我的項目中,我有一個導航控制器,當我試圖插入子視圖控件時,出現此錯誤。

問題是我需要通過設置managedObjectContext。這是從CoreDate Master/Detail示例中獲取的。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
     [[segue destinationViewController] setDetailItem:object]; 
     // set the managedObjectContext, too, if you need it 
     [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
    } 
} 

此外,請仔細檢查Interface Builder中的segue標識符是否與此函數(本例中的showDetail)中的內容匹配。

相關問題