2011-12-18 39 views
0

終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」,理由核心數據:「+ entityForName:未能找到NSManagedObjectModel爲實體名稱'人」 *誤差與nsmanagedobject方面

的實體在數據模型文件中創建,並將核心數據函數添加到應用程序委託文件中。

我想在我的第一個視圖控制器,它是一個標籤,按這樣做是爲了使用核心數據:

- (IBAction)save:(id)sender { 

NSLog(@"String is %d", [choiceSeg selectedSegmentIndex]); 

NSManagedObjectContext *context = self.managedObjectContext; 

Persons *person = (Persons *)[NSEntityDescription insertNewObjectForEntityForName:@"Persons" inManagedObjectContext:context]; 

NSNumber *ageValue = [NSNumber numberWithInt:[choiceSeg selectedSegmentIndex]]; 

[person setAge:ageValue]; 

// Save the context 
if (![context save:nil]) { 
    // error checking 
} 

而且,我做合成managedObjectContext在我看來。

我做錯了什麼?

+0

您不應該在視圖中使用上下文。另外,它不應該是「人」而不是「人」嗎? – Eimantas 2011-12-18 11:27:25

+0

如果我不應該在視圖中使用上下文,我如何從視圖中插入核心數據? – Ayrad 2011-12-18 11:33:00

+1

查看無法瞭解邏輯(插入)。它的唯一目的是顯示數據。插入應該在模型中完成。插入操作應在控制器中調用。 – Eimantas 2011-12-18 11:37:00

回答

1

當您的NSManagedObjectContext實例爲零時會發生此錯誤。向視圖控制器提供上下文的推薦方式是通過引用傳遞。要將您的應用程序代理的上下文通過UITabBarController傳遞給第一個視圖控制器非常簡單。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)options 
{ 
    // Assuming you don't already have a property for this (i.e. setup by a storyboard) 
    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 

    if (!tabBarController.viewControllers.count) 
     return; 

    FirstViewController *fvc = (FirstViewController *)[tabBarController.viewControllers objectAtIndex:0]; 

    // Assumes that this view controller has a public writable @property for a context. 
    fvc.managedObjectContext = self.managedObjectContext; 

    // ... [self.window makeKeyAndVisible]; etc... 
} 

我知道這不是最好的方法,因爲標籤欄項目可以重新排列,我們正在明確尋找第一個。在嘗試設置上下文之前,先檢查返回的視圖控制器的類是明智的。

+0

有趣,我會試試這個。對於我來說,我似乎覺得沒有一箇中心環境,我們可以在應用程序的任何地方訪問表單。有點像靜態類。 – Ayrad 2011-12-19 08:50:44

0

好吧,我將AppDelegate.h導入到我的視圖控制器中,並使用它的managedObjectContext在覈心數據中輸入一個項目。

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

它的工作原理!

但是我想知道如果我們每次需要使用核心數據時都必須導入委託並獲取對上下文的本地引用。

+1

Apple建議您通過引用每個視圖控制器來傳遞託管對象上下文,而每個視圖控制器都需要它而不是視圖控制器引用應用程序委託。 – 2011-12-18 21:41:02

+0

我更喜歡這樣做的建議方式,但我怎麼會將上下文傳遞給我的firstviewController這是一個視圖內tabbbar控制器(我認爲我的根視圖)? – Ayrad 2011-12-18 22:26:48

+1

在答案中提供代碼。 – 2011-12-18 22:55:15