2010-06-14 2 views
1

У меня есть сущность в основных данных, называемых Location. Внутри этого поля есть несколько полей, например дата. Но я также хотел бы сохранить объект класса в нем, который я создал под названием Annotation. Какой тип атрибута я бы использовал для этого, так как это пользовательский объект класса, который я создал?iPhone: Core Data save Объект класса

Location (object) 
|__ Date 
|__ Annotation (MKAnnotation protocol) 

ответ

1

легче было бы добавить класс как класс основных данных, то вы могли бы просто иметь отношения между этими двумя классами, как отношение один к одному. однако вы можете использовать двоичные данные типа как тип атрибута и хранить любые данные, которые вы хотите там. (я использую это, чтобы иногда хранить c-структуры). Вам просто нужно использовать класс NSData, чтобы обернуть ваш объект и установить его свойство.

+0

Хорошо, но поскольку мне нужно было бы создавать атрибуты для аннотации, а тип координаты - CLLocationCoordinate2D, как мне его сохранить? –

2

У вас есть два варианта:

  1. Если Annotation класса соответствует протоколу NSCoding (или, если вы готовы написать NSValueTransformer преобразовать свой собственный класс на NSData Например, вы можете использовать трансформируемый атрибут в вашей организации Основной данные. Основные данные будут использовать назначенный NSValueTransformer автоматически сериализации/десериализацию вашего Annotation экземпляра для вас.

  2. Вы можете создать Annotation объекта в вашей модели данных ядра. Вам нужно будет написать свой собственный код, чтобы назначить объекту CLLocationCoordinate2D. Вероятно, вы создали бы постоянную поддержку с помощью двух double s, а затем записывали сеттеры/аксессоры для CLLocationCoordinate2D.

Преимущество (1) является то, что легче (если ваш класс соответствует NSCoding). Преимущество (2) заключается в том, что вы можете запрашивать данные внутри объекта, даже если они используют постоянные хранилища SQLite. Если вы используете (1), данные непрозрачны для механизма запросов SQLite, поэтому вы не сможете запросить его с помощью бэкэнд SQLite.

+0

Лично я бы пошел с номером два. –

+0

И @mzarra точно знал бы. Я также лично рекомендую взять длинный взгляд и выбрать второй вариант. –

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