-1

对于以下代码,在下面的两个注释之前的行中,只有第一个有效。

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*'
4

2 回答 2

5

在我们开始之前,重要的是要指出在 Objective-C 中编写代码时应该遵循一些约定。类名应以大写字母开头:Event, NSManagedObject, MKMapView。变量应以小写字母开头:event, currentUser, myMapView.

现在,你的问题。 [Event setValue:foo forKey:value]Event.value=foo(sic) 不一样,除了变量值是包含字符串的 NSString 的情况value。(ie, NSString *value = @"value") 说得更清楚些,foo.bar=baz相当于[foo setValue:baz forKey:@"bar"]not [foo setValue:baz forKey:bar]

于 2010-10-11T23:08:27.990 回答
3

您看到的问题是由称为关联存储的 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编译器指令来完成,但无论哪种方式,您都必须拥有该方法。没有方法,没有点符号。

当您刚刚学习 Core Data 时,最好使用通用 NSManagedObjects 并setValue:forKey:继续使用自定义 NSManagedObject 子类。

于 2010-10-12T21:19:55.973 回答