2010-06-12 58 views
3

我做了一些改變,我的模型(但我不想移民,所以我剛剛刪除的應用程序,內置清潔等)NSEntityDescription entityForName返回nil

然而,當我在iPhone上運行,或在模擬器中,我得到以下錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.' 

我設置的實體是這樣的:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 

我managedObjectContext不爲零。但我懷疑它不正確加載的對象模型或類似的東西,因爲如果我在模型中顯示實體列表爲空:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 
NSLog(@"%d", [[managedObjectModel entities] count]); 

我怎樣才能確保模型加載?

謝謝,

回答

6

你在哪裏「顯示實體」?如果它們沒有顯示在數據模型編輯器中,則它們不在那裏。

您可以使用-[NSManagedObjectModel entities]獲取,該模型具有實體的數組。

反過來,你可以使用-[NSPersistentStore managedObjectModel]看到裝有何種模型,然後查詢它的實體。

得告訴你然而,大部分時間這個錯誤是由拼寫錯字造成的。這就是爲什麼使用定義或類方法返回實體名稱的原因。

+0

實體在實體編輯器中顯示。 我通過打印[NSManagedObjectModel實體]的計數來顯示實體。它是空的。 對於錯字我會仔細檢查,但我沒有改變任何代碼。我只是在我的模型中添加了一些字段。 – Kamchatka 2010-06-13 00:25:33

+1

對於空模型最簡單的解釋是,出於某種原因,更改後的模型未被編譯到應用程序中。商店協調員正在使用空白或無模式進行初始化。 – TechZen 2010-06-13 19:40:34

+0

那麼,該怎麼做呢?我遇到了完全相同的問題。除了應用程序在我的電腦上運行良好,但不會在朋友的電腦上運行。我們使用相同的代碼, – 2011-05-11 14:52:54

6

我遇到了同樣的問題。正如TechZen的評論中所建議的,對我來說,修正是在Xcode 3.x中右鍵單擊該文件,選擇「獲取信息」,然後在「目標」選項卡下勾選相應的框。

UPDATE: 在Xcode中4 「獲取信息」 菜單選項已被刪除。相反,您可以爲右側欄中的文件定義「目標成員資格」。

+0

我有一個相當新的項目,它是使用基於Window的應用程序與核心數據和通用(iphone和ipad)創建的。並且xcdatamodel文件未包含在默認目標中。選中包含該框的框爲我解決了這個問題。 – 2011-02-20 06:22:00

+0

我右鍵單擊.xcdatamodel我沒有看到獲取信息 – 2011-05-11 14:54:14

+0

Jim:是的,Xcode 4切換了一些東西 - 我已經更新了答案。 – WebSeed 2011-05-12 09:58:26

0

我遇到過這個問題,發現這個解決方案:沒有多個項目與Xcode同時打開。如果您有多個項目,Xcode將使用來自錯誤項目的數據模型,但找不到您的實體。

1

另一個要注意的是,當你點擊xcdatamodeld文件查看實體並沒有什麼,在配置下左側,默認配置,你看實體的名單。如果他們是你的項目中的類(我認爲他們應該是),請確保將類名放在Class列下。

0

有同樣的問題。在我的情況下,舊模型仍在加載,所以我不得不清理項目,並從模擬器卸載應用程序。

要調試:

  • 爲了在對象模型中,以打印出所有的實體所使用的這樣的: 的NSDictionary *詞典= [self.managedObjectContext.persistentStoreCoordinator。managedObjectModel entitiesByName]; (字符枚舉鍵和ObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key,id obj,BOOL * stop){ NSLog(@「%@ =%@」,key,obj); }];使用這個來打印出實體的數量: NSLog(@「實體數量:%d」,[[self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] count]);
0

在我的情況:

  1. Model.xcdatamodeld是先在一個應用程序(名稱的),然後正常工作
  2. 我補充修改應用的靜態庫
  3. 添加步驟2靜態庫到一個新的應用程序(名稱B)

我有同樣的問題,堪察加時使用應用B

您可以嘗試將Model.xcdatamodeld移至主項目嘗試,這對我很有用。

0

我遇到這個問題&有一個非常奇怪的修復。我複製/粘貼一些代碼在不同項目的實際創造的實體(&然後改變爲實體值&上下文):

NSEntityDescription *e = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext]; 

..這是,不管是什麼我查了一下,返回零,儘管該實體明確存在於上下文中。

我所做的只是刪除線,改變變量名,&手動重新鍵入:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext]; 

我希望我能告訴你爲什麼這個固定 - 我還不能確定。我以前曾嘗試發佈到此頁面的所有解決方案。我懷疑這需要做些什麼「有多個項目打開」 - 所以如果你和我處於同樣的情況,請嘗試手動重寫數據模型加載/獲取過程。