Подтвердить что ты не робот

Проблема с CoreData: - [NSManagedObject setValue:]: непризнанный селектор, отправленный в экземпляр

Я только начал с CoreData вчера, и я схожу с ума:( Я создал проект, который использует CoreData (пометил флажок -use CoreData). Создал сущности, а затем создал классы NSManagedObject для всех объектов (I предположим, что они создают методы "setter" и "getter" для сущностей).

Теперь я # импортировал все эти классы в свой AppDeletegate и написал это в моем методе applicationDidFinishLaunching:

(Подписки являются одним из Entities в приложении)

NSManagedObjectContext *context = [self managedObjectContext];
 Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
 [sbs setTitle:@"OK"];
 [sbs setType:@"Tag"];
 [sbs setCode:@"cars"];

 NSError *error = nil;
 if (![context save:&error]) {
  NSLog(@"Couldn't create the subscription");
 }

Когда я запускаю это, я получаю эту ошибку

[NSManagedObject setTitle:]: непризнанный селектор, отправленный в экземпляр 0x6160550

Я понятия не имею, почему это происходит. Пожалуйста помоги!!! Спасибо заранее всем!

Добавление заголовка подписки
Subscriptions.h

@interface Подписки: NSManagedObject {
}
@property (неатомный, сохраняющий) NSString * Тип;
@property (nonatomic, сохранить) NSDecimalNumber * Read;
@property (неатомный, сохраняющий) NSString * Название;
@property (неатомный, сохраняющий) NSString * Code;
@property (nonatomic, сохранить) NSDecimalNumber * New;
@end

Я ничего не менял. Это так же, как Xcode создал его.

4b9b3361

Ответ 1

Чтобы напомнить, что не используйте имя переменной с заглавной буквы, это может повлиять на то, что геттеры и сеттеры не работают должным образом.

Если вы сгенерировали подклассы NSManagedObject из модели данных, все должно быть прекрасным, хотя это @dynamic, сеттеры реализуются с помощью coredata, и поскольку они уже реализованы, вы не должны изменять его для синтеза. По крайней мере, для меня coredata возвращает пустой объект после того, как я изменил @dynamic на @synthesize.

И не забудьте указать имя класса в модели данных:

enter image description here

Ответ 2

Я получил это, и сделал проект Clean, и он исправил его.

Ответ 3

Я добавил attirbute к объекту Core Data, и вместо повторного создания NSManagedObjectSubclass я попытался получить фантазию и вручную добавить @property и @dynamic в существующий подкласс.

Это не сработало, поэтому я пошел и заново создал подкласс через XCode, когда я начал получать эту ошибку ( "непризнанный селектор, отправленный экземпляру" при установке значения для атрибута).

Итак, я создал новую версию Core Data Model через XCode, затем очистил, удалил производные данные и , а затем заново создал подкласс NSManagedObject. Это сработало.

Вероятно, это создало новую модель данных и новый подкласс на основе этого, поэтому мне, вероятно, не нужно было очищать или удалять производные данные... но это тоже не повредило!

Ответ 4

Две возможные проблемы

У вас есть соответствующий @dynamic блок в .m файле для этих свойств и

Не используйте заглавные свойства, соглашения о кодировании заключаются в том, что свойства имеют строчные буквы для первой буквы, по крайней мере, так, что когда компилятор синтезирует методы.

@property (nonatomic, retain) NSString * type; в .h

и

@dynamic type; в .m

становится чем-то вроде

-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
} 

-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}

в фоновом режиме. Хотя вы не можете видеть этот код когда-либо.

Соглашения о случаях зависят от вас, но Camel Caps номинально нормально с Cocoa. Но его как объект, такой как Big Furry Cat, становится bigFurryCat. Следуйте стилю в примерах яблока.

EDIT - измените @synthesize на @dynamic

Ответ 5

Я обнаружил, что, имея отношения к сущностям, я должен был убедиться, что некоторые из моих отношений будут для многих, я сделал снимок экрана, чтобы вы могли видеть, что я имею в виду, отношение to-many указано стрелкой с двойным концом

enter image description here

Ответ 6

Мне кажется, что атрибут Title не может быть установлен в строку. Вы проверяете это?

Обычно непризнанный селектор, отправленный экземпляру, является причиной ошибки времени выполнения, отправляя сообщение объекту, который объект не знает, как обращаться.

Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
sbs.Title = @"OK";

Надеюсь, что поможет

Я сделал простой проект здесь

Ответ 7

У меня была та же проблема, и я нашел не очень элегантное решение. Кажется, что

[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];

создает старую версию myEntity, которая не имеет атрибутов самой последней версии. Поэтому я изменил имя myEntity в старой версии модели на myEntityOld, и я больше не получил ошибку.

Я подозреваю, что в XCode есть элегантный способ сделать то же самое, установив свойство NSManagedObject или NSEntityDescription.

Ответ 8

выполните следующие шаги

1) создала новую версию базовой модели данных с помощью Xcode.

2) Исправьте связь (добавлено новое соотношение между ними. )

Создание отношений управляемых объектов

3) повторно создал подкласс NSManagedObject