iphone core-data save store cllocation

¿Cómo almacenar CLLocation usando Core Data(iPhone)?



core-data save (5)

Intento guardar una ubicación y recuperar la ubicación en un mapa luego usando Core Location, MapKit y Core Data frameworks.

Lo que hice fue crear una entidad llamada POI y agregar propiedades como latitud (tipo doble), longitud (tipo doble) con algunas otras.

En pocas palabras, mi aplicación guarda POI con dos NSNumbers. (lat y long) pero creo que debe haber una forma más inteligente de almacenar CLLocation que eso.

aclamaciones.


CLLocation implementa el protocolo NSCoding para que pueda almacenarlos en Core Data como atributos transformables. Puede usar el transformador de valores predeterminado NSKeyedUnarchiveFromData.

Simplemente pasaría el objeto CCLocation al atributo de objeto gestionado y lo serializaría a datos y lo almacenaría como un blob en el almacén SQL. Cuando necesite recuperar el objeto de ubicación, automáticamente revertiría el proceso y le devolvería un objeto CCLocation completamente poblado.

Esa podría ser la forma más fácil de obtener lo que quieres.


La "mejor" forma de almacenarlo depende de lo que quieras hacer con él:

  • Si desea el "mismo" CLLocation, serialícelo. NSKeyedUnarchiveFromData está bien.
  • Si solo desea buscar en latitud y longitud, almacénelas como dobles (y marque la casilla "indexada").

Hay muchas propiedades adicionales que puede guardar / restaurar si lo hace manualmente (altitud, precisión horizontal, exactitud vertical, marca de tiempo). Hay algunos más que no puedes (velocidad, rumbo); CLLocation no proporciona un método init adecuado y las propiedades son de solo lectura.

Todas las propiedades adicionales son útiles si estás grabando una pista. La altitud es útil si está grabando un PDI en un terreno montañoso ("todavía tenemos que subir 100 m"). la precisión horizontal / vertical podría usarse para representar qué tan grande es el PDI (por ejemplo, una ciudad puede tener una "precisión horizontal" de varios kilómetros y mostrarse como un círculo grande).


No necesita usar NSNumber para almacenar puntos de latitud y longitud. Puede almacenar CLLocation directamente en los datos centrales.

Establezca una entidad para cada CLLocation, será una relación demasiados para cualquier entidad que use puntos de ubicación. Llamemos a este LocationPoint:

class LocationPoint: NSManagedObject { @NSManaged var game: NSNumber @NSManaged var time: NSDate @NSManaged var location: AnyObject }

A continuación, establece la propiedad de ubicación para que se pueda transformar en el modelo de datos de Xcode. ¡Eso es!

En Objective-c, en realidad puede declarar esta propiedad de LocationPoint como CLLocation sin ningún error:

@property (nonatomic, strong) CLLocation *location

Más información aquí .


Puede hacer esto de manera muy simple simplemente estableciendo el tipo de atributo Datos centrales en Transformable . El transformador predeterminado si deja en blanco el nombre de Value Transformer es NSKeyedArchiver que funciona con la mayoría de los tipos de Foundation, como NSURL y CLLocation.


Lo que estás haciendo está bien. Deberías guardar la latitud y la longitud como dobles en Datos centrales. Cuando necesite obtener la información nuevamente, recupere los duplicados de Core Data y construya una estructura CLLocationCoordinate2D con una función como CLLocationCoordinate2DMake . No hay una forma integrada de almacenar una ubicación, por lo que almacenar los componentes de latitud y longitud está bien.

Si no está haciendo ninguna operación matemática en la latitud o longitud (encontrar recuadros delimitadores, etc.), puede almacenarlos como cadenas. Los flotantes y dobles pueden cambiar sus valores ligeramente, haciendo que las operaciones de comparación fallen.