Как хранить CLLocation с помощью Core Data (iPhone)? - PullRequest
34 голосов
/ 26 сентября 2010

Я пытаюсь сохранить местоположение и впоследствии получить местоположение на карте, используя Базовые Местоположение, MapKit и Базовые платформы данных.

Я только что создал объект с именем POI и добавил несколько свойств, таких как широта (двойной тип), долгота (двойной тип).

Проще говоря, мое приложение сохраняет POI с двумя номерами NSN.(длинный и длинный), но я чувствую, что должен быть более умный способ хранить CLLocation, чем этот.

ура.

Ответы [ 5 ]

35 голосов
/ 26 сентября 2010

То, что вы делаете, прекрасно.Вы должны сохранить широту и долготу как двойные в Базовых данных.Когда вам понадобится снова получить информацию, получите двойные значения из Core Data и создайте структуру CLLocationCoordinate2D с функцией, подобной CLLocationCoordinate2DMake.Не существует встроенного способа хранения местоположения, поэтому хорошо хранить компоненты широты и долготы.

Если вы не выполняете никаких математических операций с широтой или долготой (находя ограничивающие рамки и т. Д.), Вы можете сохранить ихкак строки.Плавающие и двойные могут слегка изменить свои значения, что приводит к сбою операций сравнения.

27 голосов
/ 26 сентября 2010

CLLocation реализует протокол NSCoding, поэтому вы можете сохранить их в Базовых данных в качестве преобразуемых атрибутов. Вы можете использовать преобразователь значения NSKeyedUnarchiveFromData по умолчанию.

Вы просто передали бы объект CCLocation атрибуту управляемого объекта, и он бы сериализовал его в данные и сохранил его как большой двоичный объект в хранилище SQL. Когда вам понадобится вернуть объект местоположения, он автоматически обратит процесс и вернет вам полностью заполненный объект CCLocation.

Это может быть самый простой способ получить то, что вы хотите.

17 голосов
/ 26 сентября 2010

«Лучший» способ хранения зависит от того, что вы хотите с ним сделать:

  • Если вы хотите "тот же" CLLocation, сериализуйте его. NSKeyedUnarchiveFromData в порядке.
  • Если вы просто хотите искать по широте и долготе, сохраните их как двойные (и установите флажок «проиндексировано»).

Существует множество дополнительных свойств, которые можно сохранить / восстановить, если вы сделаете это вручную (высота, точность по горизонтали, точность по вертикали, отметка времени). Есть еще некоторые, которые вы не можете (скорость, курс); CLLocation не предоставляет подходящий метод init, а свойства доступны только для чтения.

Все дополнительные свойства полезны, если вы записываете дорожку. Высота полезна, если вы записываете POI на гористой местности («нам еще нужно подняться на 100 м»). Точность по горизонтали / вертикали может использоваться для представления того, насколько велик POI (например, город может иметь «точность по горизонтали» в несколько километров и отображаться как большой круг).

2 голосов
/ 03 февраля 2015

Вы можете сделать это очень просто, просто установив тип атрибута Core Data на Transformable. Преобразователь по умолчанию, если оставить значение Имя преобразователя значения пустым - NSKeyedArchiver, который работает с большинством типов Foundation, таких как NSURL и CLLocation.

0 голосов
/ 17 октября 2015

Вам не нужно использовать NSNumber для хранения точек широты и долготы. Вместо этого вы можете хранить CLLocation непосредственно в основных данных.

Установите сущность для каждого CLLocation, это будет слишком много отношений от того объекта, который использует точки местоположения. Давайте назовем это LocationPoint:

class LocationPoint: NSManagedObject {

@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject

}

Затем вы устанавливаете свойство location для преобразования в модели данных Xcode. Вот и все!

В Objective-c вы действительно можете объявить это свойство LocationPoint как CLLocation без каких-либо ошибок:

@property (nonatomic, strong) CLLocation *location

Подробнее здесь .

...