我是Core Data的新手,并编写了一个小测试应用程序。我要做的是有一个对象,我可以保存到一个sqlite数据库。
我的属性如下:
@property (nonatomic, retain) NSString * address;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSNumber * latitude;
@property (nonatomic, retain) NSNumber * longitude;
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * notes;
@property (nonatomic, retain) NSString * state;
@property (nonatomic, retain) NSString * street;
@property (nonatomic, retain) NSString * zip;
这些都是.m文件中的@dynamic。
我原来是这样做的:
+ (AddressAnnotation *)initWithPlacemark:(CLPlacemark *)placemark inContext:(NSManagedObjectContext *)context {
AddressAnnotation *anAddress = [NSEntityDescription insertNewObjectForEntityForName:@"AddressAnnotation" inManagedObjectContext:context];
anAddress.address = placemark.subThoroughfare;
anAddress.street = placemark.thoroughfare;
anAddress.city = placemark.locality;
....
return anAddress;
}
但是,我不知道如何覆盖
- (NSString *)title;
- (NSString *)subtitle;
为协议,所以我的标注显示。其中一个看起来像:
- (NSString *)title {
if (self.name) {
return self.name;
}
else {
return @"";
}
}
字幕非常相似,但与其他属性相似。但是,这不起作用,因为这些是实例而不是类对象吗?
所以我将初始化程序改为:
- (AddressAnnotation *)initWithPlacemark:(CLPlacemark *)placemark inContext:(NSManagedObjectContext *)context {
AddressAnnotation *anAddress = [NSEntityDescription insertNewObjectForEntityForName:@"AddressAnnotation" inManagedObjectContext:context];
NSLog(@"placemark: %@", [placemark description]);
anAddress.address = placemark.subThoroughfare;
anAddress.street = placemark.thoroughfare;
...
return anAddress;
}
但是,当我这样做时,我的所有值都为空。在这种情况下编写初始化程序的正确方法是什么?谢谢!
答案 0 :(得分:0)
您的第一个+initWithPlacemark
看起来正确,但名称除外。 initWith…
方法几乎保留用于“构造函数”。使用类似+insertNewAddressAnnotationWithPlacemark:
或更短+newWithPlacemark:
方法名称的内容。 -initWithPlacemark:
绝对是一个坏主意。
-title
的实施似乎已经足够了,但是当你告诉它是否起作用时,我不明白你的意思,其余的则是。
如果要为属性设置特定的默认值,可以使用模型默认值字段。 -awakeFromInsert
是另一种设置默认值的方法,例如可转换属性或计算的默认值。 +insertNewWith…
类方法是创建,插入和初始化具有特定值的新实例的完美方法。