Основные данные: два разных способа доступа к атрибутам, работает только один - PullRequest
0 голосов
/ 11 октября 2010

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

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 
//Work but strange
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value]; 
 //Error
Event.value= [NSNumber numberWithInt:buf4[v+h]]; 

Второе возвращение и ошибка

request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*'

Ответы [ 2 ]

5 голосов
/ 12 октября 2010

Прежде чем мы начнем, важно отметить, что существуют правила, которым необходимо следовать при написании кода в Objective-C. Имена классов должны начинаться с заглавной буквы: Event, NSManagedObject, MKMapView. Переменные должны начинаться со строчной буквы: event, currentUser, myMapView.

Теперь к вашей проблеме. [Event setValue:foo forKey:value] и Event.value=foo (sic) не одинаковы, за исключением случая, когда значением переменной является строка NSString, содержащая строку value. (т. е. NSString *value = @"value") Проще говоря, foo.bar=baz эквивалентно [foo setValue:baz forKey:@"bar"], а не [foo setValue:baz forKey:bar].

3 голосов
/ 13 октября 2010

Проблема, которую вы видите, вызвана поведением класса 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.

...