2012-07-21 29 views
71

我已經將所有相關的代碼添加到App Delegate,並且我能夠添加到數據模型並從applicationDidFinishLaunchingWithOptions中的數據模型中獲取。'+ entityForName:nil不是合法的NSManagedObjectContext參數 - 核心數據

我的問題來了,當我試圖寫入我的視圖控制器中的數據模型。我加入這個代碼的頭文件:

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

這代碼我實現文件:

NSManagedObjectContext *context = [self managedObjectContext]; 
NSManagedObject *model = [NSEntityDescription 
          insertNewObjectForEntityForName:@"Events" 
          inManagedObjectContext:context]; 
[model setValue:@"Sample Event" forKey:@"eventName"]; 

NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Couldn't save: %@", [error localizedDescription]); 
} 

不過,我得到以下錯誤:

'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Events'' 

有誰知道這是怎麼回事?任何幫助,將不勝感激。

+12

我認爲上下文爲零。確保[self managedObjectContext]沒有返回nil – mask8 2012-07-21 23:19:52

+1

注意爲了後代的緣故,如果您將ManagedObjectContext傳遞給iDar,而不是使用getter方法 – Matthematics 2013-04-07 03:32:47

回答

36

如果您正在使用塞格斯你會得到同樣的問題,如果你沒有通過上下文。在課堂上的prepareForSegue方法啓動SEGUE使用此代碼:

[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 

,它假定你把你的情況下在一個名爲當然「managedObjectContext」屬性。

+1

我將其設置爲_managedObjectContext並崩潰。 self.mangeObjectContext解決它。謝謝! – 2015-06-22 08:14:47

+0

很好用!我相信,發佈Xcode 4.4,如果你只是使用「@synthesize myProperty;」編譯器會創建一個名爲「myProperty」的實例變量,而不是「_myProperty」。如果你完全不使用「@synthesize」,你會得到「_myProperty」。所以「_managedObjectContext」實際上可能不存在。我不知道,因爲我看不到你的代碼。 「self.managedObjectContext」是安全的,因爲它會像往常一樣調用訪問器。 – Tim 2015-06-28 11:26:55

46

我忘了將上下文傳遞給視圖控制器。菜鳥錯誤。

+0

,則可以得到此錯誤,並且這是將上下文傳遞給視圖控制器的方式:AppDelegate * appDelegate =(AppDelegate *)[[UIApplication sharedApplication] delegate]; context = [appDelegate managedObjectContext]; – 2015-01-09 13:19:08

45

你開始獲取數據之前,您可以通過傳遞包含下面的代碼的背景下形成的數據庫:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 
context = [appDelegate managedObjectContext]; 
+0

感謝這個不錯的小片段..我永遠不會記得完整的語法! – RyanG 2012-12-06 15:51:40

20

你應該添加到您的viewController:

id delegate = [[UIApplication sharedApplication] delegate]; 
    self.managedObjectContext = [delegate managedObjectContext]; 
0

如果目標視圖控制器嵌入NavigationController,上下文需要適當地設置如下 -

self.mydetailViewController = [[[segue destinationViewController] viewControllers] objectAtIndex:0]; 
[self.mydetailViewController setManagedObjectContext:self.managedObjectContext]; 
2

我得到這個問題和一位同事幫助我。如果您收到此錯誤消息: 「entityForName:nil不是搜索實體名稱的合法NSManagedObjectContext參數」。你在coredata模型中做出了改變。我認爲問題可能不是代碼

該解決方案可以很簡單。嘗試以下選項之一:

  • 只需從您正在測試的設備中刪除應用程序,它應該有您的模型的舊版本。
  • 使用Xcode創建另一個數據庫版本>編輯器>添加模型版本。

希望它有幫助。

1

在我的情況下.xcdatamodeld被貼錯標籤的AppDelegate中:

let container = NSPersistentContainer(name: "name of data model") 
0

我懶初始化的粉絲。這樣如果你需要爲你的測試注入一個新的上下文,或者如果你在那裏設置你的MOC,它會從應用程序委託中得到它的上下文。

class.h 
@property (strong, nonatomic,getter=getManagedObjectContext) NSManagedObjectContext *managedObjectContext; 

class.m 
    -(NSManagedObjectContext *)getManagedObjectContext { 
     if (_managedObjectContext) { 
      return _managedObjectContext; 
     } 
     _managedObjectContext = [[(AppDelegate *)[[UIApplication sharedApplication]delegate]sharedDataModel]managedObjectContext]; 
     return _managedObjectContext; 
    } 
相關問題