Проблема, которую вы видите, вызвана поведением класса NSManagedObject, называемого ассоциативным хранилищем.
Ассоциативное хранилище в основном превращает любой универсальный NSManagedObject в словарь, ключами которого являются имена свойств назначенного ему объекта.Вы устанавливаете и получаете доступ к значениям для ключей так же, как и для словаря или любого другого класса, соответствующего значению ключа.Поэтому, когда вы используете универсальный управляемый объект, подобный этому:
NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext];
... вы получаете универсальный экземпляр NSManagedObject с ключами сущности str
, как определено в модели данных.Таким образом, когда вы можете использовать кодирование значения ключа для хранения значения в универсальном экземпляре NSManagedObject:
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];
или, более точно, что-то вроде:
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:@"anAttributeName"];
Однако точечная запись - это нечторазные.Когда вы вызываете Event.anAttributeName
, вы вызываете метод в пользовательском подклассе NSManagedObject.Чтобы это работало, вы должны сгенерировать пользовательский подкласс с именем Event
и назначить его объекту Event
в модели данных.
Когда вы используете точечную запись, вы вызываете метод, который выглядит примерно так:
-(void) setAnAttributeName:(NSNumber *) aNumber{
//some boilerplate
[self setPrimativeValue:aNumber forKey:@"anAttributeValue"];
// some more boilerplate
}
Вы можете написать метод самостоятельно или использовать директиву компилятора @dynamic
, чтобы сделать это для, нов любом случае, у вас должен быть метод.Нет метода, нет точечной записи.
Когда вы только изучаете базовые данные, лучше всего использовать универсальные NSManagedObjects и setValue:forKey:
переходить к пользовательским подклассам NSManagedObject.