1

我有以下錯誤:另一個,原因是:「+ entityForName:未能找到NSManagedObjectModel爲實體名稱

2012-04-18 10:15:49.585 FoodXJournal[13931:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes'' 

我讀過的大多數與此主題的其他問題,和done一些檢查。

我有一個包含靜態表視圖的詳細視圖控制器。表視圖的一個單元格標記爲「刪除」,並鏈接到名爲「deleteCT」的segue。我希望應用程序刪除self.detailItem,並在點擊此單元格時繼續到主視圖控制器。這是我的方法。所有NSLog線都用於調試。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"deleteCT"]) { 
     if (![self.detailItem.myCommodities count]) { 
      NSLog(@"Testing"); 
      NSLog(@"myCommodities is empty:%@", [self.detailItem.myCommodities count]); 
      NSLog(@"self.detailItem HAS a context:%@", [self.detailItem managedObjectContext]); 
      NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]); 
      NSLog(@"self.detailItem has a managed object model:%@", [[self.detailItem entity] managedObjectModel]); 
      [[self.detailItem managedObjectContext] deleteObject:self.detailItem]; 
     } 
    } 
} 

這是日誌。我得到的這個方法,

2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] Testing 

我滿足我的條件刪除,

2012-04-18 10:15:49.544 FoodXJournal[13931:fb03] myCommodities is empty:(null) 

錯誤消息說'+entityForName: could not locate an NSManagedObjectModel for entity name 'CommodityTypes',但self.detailItem有一個背景。

2012-04-18 10:15:49.545 FoodXJournal[13931:fb03] self.detailItem HAS a context:<NSManagedObjectContext: 0x6d7e740> 

是,self.detailItem是我想的實體類型:

2012-04-18 10:15:49.546 FoodXJournal[13931:fb03] self.detailItem is of CommodityTypes:CommodityTypes 

而且,沒錯,就是實體類型(NSLog(@"self.detailItem is of CommodityTypes:%@", [[self.detailItem entity] name]);)的管理對象模型:

管理對象模型描述很長,所以我只在這裏展示它的第一部分:

2012-04-18 10:15:49.565 FoodXJournal[13931:fb03] self.detailItem has a managed object model:(<NSManagedObjectModel: 0x6d73250>) isEditable 0, entities { 
Accounts = "(<NSEntityDescription: 0x6d71120>) name Accounts, managedObjectClassName Accounts, renamingIdentifier Accounts, isAbstract 0, superentity name Grandparent, properties {\n \"account_1\" = \"(<NSAttributeDescription: 0x6d6e9d0>), name account_1, isOptional 1, isTransient 0, entity Accounts, 

向下滾動:

CommodityTypes = "(<NSEntityDescription: 0x6d71240>) name CommodityTypes, managedObjectClassName CommodityTypes, renamingIdentifier CommodityTypes, isAbstract 0, superentity name Grandparent, properties {\n myCommodities = \"(<NSRelationshipDescription: 0x6d701f0>), name myCommodities, isOptional 1, isTransient 0, entity CommodityTypes, 

CommodityTypes在管理對象模型中定義。

那麼爲什麼[[self.detailItem managedObjectContext] deleteObject:self.detailItem];崩潰?!?

是否有某些原因我無法在prepareForSegue中刪除self.detailItem?我是否需要爲單元格或標籤分配一個操作,然後以編程方式調用segue?

+0

我嘗試用這三行代替問題行,以防存在一些訪問器問題,但它仍然崩潰。 '// [[self.detailItem managedObjectContext] deleteObject:self.detailItem]; NSManagedObjectContext * thisContext = [self。detailItem managedObjectContext]; NSManagedObject * thisItem = self.detailItem; [thisContext deleteObject:thisItem]; ' – adamek 2012-04-18 14:54:04

+0

你確定它是導致崩潰的那條線嗎?錯誤消息看起來像來自_creates_託管對象 – jrturton 2012-04-18 14:54:05

回答

3

尤里卡!謝謝jrturton!這不是來自創建新託管對象的方法,但是您的想法確實讓我回過頭來,並在該行前後使用了一堆斷點。我在主表視圖中縮小到NSEntityDescription *entity = [NSEntityDescription entityForName:@"CommodityTypes" inManagedObjectContext:self.managedObjectContext];。啓動時,應用程序委託設置一個託管對象上下文並將其傳遞給主視圖。我忘記了,當我從詳細視圖繼續瀏覽到主視圖的下一個實例時,我不一定會回到原始實例。我必須將託管對象上下文傳遞給下一個視圖控制器。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"deleteCT"]) { 
     if (![self.detailItem.myCommodities count]) { 

      CommodityTypes * thisItem = self.detailItem; 
      NSManagedObjectContext * thisContext = [thisItem managedObjectContext]; 
      FoodXCommodityTypesMasterViewController * nextView = [segue destinationViewController]; 

      [thisContext deleteObject:thisItem]; 

      nextView.managedObjectContext = thisContext; 

     } 
    } 
} 

現在可以使用。

+1

的一種方法,您不必創建指向moc的指針;您可以將thisItem.managedObjectContext用於刪除消息和您在下一個控制器上設置的var。事實上,如果你想通過任何類型的模型,你可以在下一個控制器中使用該模型。至少幫助保持一點整潔。 – wkhatch 2012-08-29 04:29:35

相關問題