Подтвердить что ты не робот

Как сохранить CLLocation с использованием Core Data (iPhone)?

Я пытаюсь сохранить местоположение и получить местоположение на карте после этого, используя базы Core Location, MapKit и Core Data.

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

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

приветствий.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

Вам не нужно использовать 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

Дополнительная информация здесь.