Как сохранить пользовательский класс с помощью CoreData

У меня есть класс, расширяющий NSObject. Он состоит из нескольких переменных с плавающей запятой. Я хочу сохранить этот класс в основных данных.

В модели данных кажется, что наиболее вероятным вариантом является превращение этого класса в двоичные данные, чтобы хранить их с помощью CoreData.

Это правильно? Если да, то может ли кто-нибудь указать мне, как я могу хранить и извлекать свой класс с помощью CoreData?

Спасибо,


person user336994    schedule 19.10.2011    source источник


Ответы (3)


Способ, которым вы можете сделать свой пользовательский объект прозрачным, сохраненным и загруженным из Core Data, заключается в использовании NSValueTransformer. Если вы создаете NSValueTransformer, который может перейти от вашего класса к NSData и наоборот, вы можете пометить атрибут в своей сущности, соответствующий этому классу, как трансформируемый. Затем Core Data позволит вам устанавливать и извлекать объекты этого типа при работе с этим атрибутом.

В моем ответе здесь Я показываю код, как это сделать с атрибутами UIImage, которые изначально не поддерживаются Core Data. Чтобы сделать что-то подобное для своего пользовательского объекта, вам нужно сделать его совместимым с NSCoding и реализовать собственные методы -encodeWithCoder: и -initWithCoder: для его сериализации в экземпляр NSData для хранения.

У Apple есть дополнительная документация по этому вопросу в «Нестандартные постоянные атрибуты» Руководства по программированию основных данных, включая пример, в котором используется класс NSColor для Mac.

person Brad Larson    schedule 19.10.2011
comment
Хотя я думаю, что лучше всего поступить так, как предложил @beryllium; Брэд прав (конечно). - person Marcus S. Zarra; 20.10.2011

Я бы предложил создать новый объект в Core Data, смоделировать эти поля в новом объекте и реорганизовать код для использования нового пользовательского подкласса управляемого объекта.

person logancautrell    schedule 19.10.2011

Мое первое предложение — создать объект, в котором хранятся эти значения, поскольку типы объектов, которые вы используете, поддерживаются в Core Data.

Если вы собираетесь часто менять эту модель/не хотите иметь дело с миграцией данных, вы всегда можете установить свойство объекта как трансформируемое в качестве его типа в базовой модели данных. Затем убедитесь, что ваш класс реализует протокол NSCoding, как только вы это сделаете, он должен работать нормально.

person Reedy    schedule 22.07.2015