您看到的问题是由称为关联存储的 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 子类。