0

Я использую CoreData и задал Entity ContactList, который я создал с помощью Xcode xcdatamodel tool (или того, что вы называете встроенной вещью :). Я также назначил имя класса Entity «ContactList». Затем я использовал автогенератор rentzsch (http://github.com/rentzsch/mogenerator) для создания моих пользовательских файлов классов и добавил простой метод «toString» в мой класс ContactList.NSFetchedResultsController всегда возвращает объекты NSManagedObject, а не пользовательские.

Обратный вызов fetchedResultsController довольно стандартен и выглядит следующим образом:

- (NSFetchedResultsController *)fetchedResultsController { 

if (fetchedResultsController_ != nil) { 
    return fetchedResultsController_; 
} 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ContactList" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setFetchBatchSize:20]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 
[aFetchedResultsController release]; 
[fetchRequest release]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

NSError *error = nil; 
if (![fetchedResultsController_ performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

return fetchedResultsController_; 
}  

Теперь, когда я начинаю мое приложение и попытаться вызвать этот метод на объекте «ContactList», который, в свою очередь, я получаю от NSFetchedResultsController, я получаю

ContactList *contactList = (ContactList *) [self.fetchedResultsController objectAtIndexPath:indexPath]; 
[contactList toString];  
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject toString]: unrecognized selector sent to instance 0x6af7bf0' 

Как показывает сообщение, как-то NSFetchedResultsController не возвращает «ContactList» объект, но более общий NSManagedObject вместо этого.

Кто-нибудь знает, почему и как разрешить это?

+0

Как выглядит реализация вашего fetchedResultsController? Если запрос выборки неверен (например, неверный NSEntityDescription, неправильный синтаксис предикатов и т. Д.), Вы не можете в конечном итоге создать правильный тип управляемого объекта. Кроме того, что произойдет, если вы просто NSLog() объект contactList вместо вызова toString на нем? – Echelon

+0

Привет, Echelon, я добавил свою реализацию fetchedResultsController, но она довольно стандартная. NSLog (@ "% @", contactList) дает мне: (entity: ContactList; id: 0x6a04180 ; данные: ) – Sebastian

ответ

1

Хорошо, я понял это.

Проблема заключалась в том, что сценарий mogenerator не добавлял свои сгенерированные исходные файлы в цель компиляции проекта. Таким образом, классы никогда не компилировались и не включались (интересно, как они работали без классов объектов объектов :)

После добавления файла .xcdatamodel в Target (RightClick on .xcdatamodel file -> Targetets -> проверьте ваш проект) все работает сейчас.

Для получения дополнительной информации перейдите here

2

У меня была такая же проблема - вызвана тем, что я ранее переименованы Managed подкласс объектов предприятия. В Data Modeler убедитесь, что в инспекторе для объекта, как «Имя», так и «Класс» установлены правильно.

Смежные вопросы