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'' 

Я прочитал большинство других вопросов с этой темой, и сделать некоторые проверка.

У меня есть контроллер подробного представления, содержащий статический вид таблицы. Одна ячейка табличного представления помечена как «Удалить» и связана с секцией с именем «deleteCT». Я хочу, чтобы приложение удаляло 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]; авария?!?

Есть ли причина, по которой я не могу удалить self.detailItem в рамках prepareForSegue? Нужно ли мне назначать действие ячейке или метке, а затем программировать вызов segue?

+0

Я попытался заменить проблемную строку этими тремя строками в случае, если возникла проблема с доступом, но она все еще разбилась. '// [[self.detailItem managedObjectContext] deleteObject: self.detailItem]; NSManagedObjectContext * thisContext = [self.detailItem managedObjectContext]; NSManagedObject * thisItem = self.detailItem; [thisContext deleteObject: thisItem]; ' – adamek

+0

Вы уверены, что это линия, вызывающая крушение? Сообщение об ошибке выглядит так, будто оно исходит от одного из методов, которые _creates_ управляют объектами – jrturton

ответ

3

Eureka! Спасибо, 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, которое вы устанавливаете на следующем контроллере. Фактически, если вы собираетесь передавать любой тип mo, вы можете просто использовать этот mo-moc в следующем контроллере. По крайней мере, помогает держать его немного более аккуратным. – wkhatch