Сохраняйте объекты MKOverlay в Core Data
У меня большой MKOverlay
что я хотел бы сохранить в Core Data
так что мне не придется создавать его позже. Так как это не один из типов, которые вы можете выбрать в Core Data
как мне сохранить его?
Нужно ли как-то сначала его кодировать?
Нужно ли мне декодировать его при использовании?
Какой тип объекта выбрать core data
при создании новой собственности?
Спасибо, парни.
4 ответа
Если вам не нужно запрашивать различные оверлеи, и вы не используете базовые данные в другом месте вашего проекта, то вам, вероятно, лучше кэшировать оверлей на диске как закодированный NSArray.
Однако, если вы уже используете Core Data или кэшируете несколько оверлеев, вы можете кодировать / декодировать оверлей в поле типа NSData. Добавьте дополнительные поля к объекту, чтобы вы могли запросить конкретное наложение, которое вы ищете.
В iOS 5 вы можете включить дополнительное хранение полей NSData во внешнем файле, выбрав опцию "Разрешить внешнее хранение". Базовые данные будут применять эвристику, основанную на размере, чтобы определить, приведет ли блоб или внешний файл к повышению производительности.
MKOverlay соответствует NSCoding, так что вы можете кодировать и декодировать весь массив объектов MKOverlay, используя метод кодирования NSKeyedArchiver, и сохранять результат в двоичном поле в вашей сущности. Скорее всего, вам понадобятся + (NSData *)archivedDataWithRootObject:(id)rootObject для NSKeyedArchiver и + (id)unarchiveObjectWithData:(NSData *) для NSKeyedUnarchiver
Подробности о создании архива с ключами см. В разделе "Архивы" в руководстве по программированию архивов и сериализаций по адресу: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Archiving/Articles/archives.html.
Вы можете написать собственный метод доступа для двоичного поля сущности, которое кодирует и декодирует оверлейный массив для вас. Другой вариант - создать преобразователь значения, который инкапсулирует операции кодирования и декодирования. Конечным результатом будет свойство массива оверлеев, которое вы можете установить и прочитать с помощью entity.overlays.
Я верю, что вы можете использовать Apple NSCoding
библиотеки для преобразования объекта в сериализованное состояние и из него. Тем не менее, Core Data может поддерживать сохранение объектов, но NSCoding
позволяет вам сохранить любой класс, который реализует его где угодно, включая строку, отправленную на сервер, файл, записанный на диск, или, если вы такой же плохой программист, как я, NSUserDefaults
запись.
редактировать - возможно, вам придется реализовать NSCoding
в свой собственный класс на основе MKOverlay
добавив методы чтения и записи, я не уверен.
Вам необходимо взять большой набор данных, который составляет наложение, и превратить эти отдельные узлы данных в объекты NSManagedObject, которые будут храниться в CoreData.
Я имею в виду, что вы, вероятно, МОЖЕТЕ просто NSCoder целиком объединить в один гигантский блок данных, но в этот момент вы могли бы также просто записать эту вещь в плоский файл (что, честно говоря, может быть лучше, если все, что вы хотите сделать, это прочитать / записать это не меняя его).
Не используйте Core Data, если вы не собираетесь делать законные запросы или частичные изменения в наборе данных.
Почему бы вместо этого не сохранить свойства (размер, цвет, координаты и т. Д. Все можно описать с помощью NSNumbers и те, которые могут быть сохранены в Базовых данных изначально) и воссоздать MKOverlay при необходимости. Я думаю, что это гораздо более эффективный подход, если честно. Я не уверен, какое влияние оказывает создание объекта, поэтому докажите, что я неправ, если я ошибаюсь.