Проблема с 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 создал его.
Ответы
Ответ 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