2012-06-27 5 views
0

Я новичок в Core Data и написал небольшое тестовое приложение. То, что я пытаюсь сделать, это иметь объект, который я могу сохранить в базе данных sqlite.Создание инициализатора для объектов Core Data

Мои свойства выглядеть следующим образом:

@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; 

Это все @dynamic в файле .m.

Первоначально я сделал это:

+ (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 { 
    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

Ваш первый +initWithPlacemark выглядит правильно, за исключением названия. initWith… методы в значительной степени зарезервированы, например, для «конструкторов». Используйте что-то наподобие +insertNewAddressAnnotationWithPlacemark: или более короткое имя метода . -initWithPlacemark: определенно плохая идея.

Ваша реализация для -title кажется адекватной, но я не понимаю, что вы имеете в виду, когда говорите, если не работает, а остальное после.

Если вы хотите иметь конкретные значения по умолчанию для своих свойств, вы можете использовать поле значения по умолчанию модели. -awakeFromInsert - это еще один способ установить значения по умолчанию, например, для трансформируемых атрибутов или рассчитанных значений по умолчанию. Метод класса +insertNewWith… - идеальный способ создания, вставки и инициализации нового экземпляра с определенными значениями.

+0

Часть, которая показалась мне забавной. Когда я использую метод класса + для создания своего объекта, когда метод viewForAnnotation: вызывается, когда я помещаю булавку на карту, выдается окно. Когда я использую метод - instance, выноска не отображается, поскольку значение .name равно null. Мысли? Благодаря! – Crystal

Смежные вопросы