为Core Data对象创建初始化程序

时间:2012-06-27 02:18:01

标签: iphone core-data

我是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;
}

但是,当我这样做时,我的所有值都为空。在这种情况下编写初始化程序的正确方法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

您的第一个+initWithPlacemark看起来正确,但名称除外。 initWith…方法几乎保留用于“构造函数”。使用类似+insertNewAddressAnnotationWithPlacemark:或更短+newWithPlacemark:方法名称的内容。 -initWithPlacemark:绝对是一个坏主意。

-title的实施似乎已经足够了,但是当你告诉它是否起作用时,我不明白你的意思,其余的则是。

如果要为属性设置特定的默认值,可以使用模型默认值字段。 -awakeFromInsert是另一种设置默认值的方法,例如可转换属性或计算的默认值。 +insertNewWith…类方法是创建,插入和初始化具有特定值的新实例的完美方法。