web-dev-qa-db-fra.com

Comment stocker CLLocation en utilisant Core Data (iPhone)?

J'essaie de sauvegarder un emplacement et de le récupérer sur une carte à l'aide des infrastructures Core Location, MapKit et Core Data.

Ce que j'ai fait est que je viens de créer une entité nommée POI et d'ajouter des propriétés telles que latitude (type double), longitude (type double) avec quelques autres.

En termes simples, mon application enregistre les points d'intérêt avec deux numéros NSNumbers. (lat et long) mais je pense qu’il doit exister un moyen plus intelligent de stocker CLLocation que cela.

à votre santé.

33
bicbac

Ce que tu fais est bien. Vous devez enregistrer la latitude et la longitude sous forme de doublons dans les données de base. Lorsque vous avez besoin de récupérer les informations, récupérez les doublons auprès de Core Data et construisez une structure CLLocationCoordinate2D avec une fonction telle que CLLocationCoordinate2DMake. Il n'y a pas de moyen intégré pour stocker un emplacement, donc stocker les composants de latitude et de longitude convient.

Si vous n'effectuez aucune opération mathématique sur la latitude ou la longitude (recherche de cadres de contour, etc.), vous pouvez les stocker sous forme de chaînes. Les flottants et les doubles peuvent modifier légèrement leurs valeurs, ce qui rend les opérations de comparaison vouées à l'échec.

35
nevan king

CLLocation implémente le protocole NSCoding afin que vous puissiez les stocker dans Core Data en tant qu'attributs transformables. Vous pouvez utiliser le transformateur de valeur NSKeyedUnarchiveFromData par défaut.

Il vous suffirait de passer l'objet CCLocation à l'attribut d'objet géré pour le sérialiser en tant que donnée et le stocker en tant que blob dans le magasin SQL. Lorsque vous avez besoin de récupérer l'objet location, le processus est automatiquement inversé et un objet CCLocation entièrement rempli est renvoyé. 

C'est peut-être le moyen le plus simple d'obtenir ce que vous voulez. 

27
TechZen

La "meilleure" façon de le stocker dépend de ce que vous voulez en faire:

  • Si vous voulez le "même" CLLocation, sérialisez-le. NSKeyedUnarchiveFromData va bien.
  • Si vous souhaitez simplement rechercher la latitude et la longitude, stockez-les en doublons (et cochez la case "indexées").

Il y a un tas de propriétés supplémentaires que vous pouvez sauvegarder/restaurer si vous le faites manuellement (altitude, précision horizontale, précision verticale, horodatage). Il y en a plus que vous ne pouvez pas (vitesse, cap); CLLocation ne fournit pas une méthode d'initialisation appropriée et les propriétés sont en lecture seule.

Toutes les propriétés supplémentaires sont utiles si vous enregistrez une piste. L’altitude est utile si vous enregistrez un POI sur un terrain montagneux ("nous devons encore grimper à 100 m"). La précision horizontale/verticale peut être utilisée pour représenter la taille du POI (par exemple, une ville peut avoir une "précision horizontale" de plusieurs km et être affichée sous forme de grand cercle).

17
tc.

Vous pouvez le faire très simplement en définissant le type d'attribut Core Data sur Transformable. Le transformateur par défaut si vous laissez la valeur Transformer Name blank est NSKeyedArchiver qui fonctionne avec la plupart des types Foundation, tels que NSURL et CLLocation.

2
Chris Morse

Vous n'avez pas besoin d'utiliser NSNumber pour stocker des points de latitude et de longitude. Vous pouvez plutôt stocker CLLocation directement dans les données principales. 

Configurez une entité pour chaque CLLocation. La relation entre entités utilisant des points de localisation sera trop nombreuse. Appelons ce LocationPoint:

class LocationPoint: NSManagedObject {

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

}

Vous définissez ensuite la propriété location sur transformable dans le modèle de données Xcode. C'est tout!

En Objective-c, vous pouvez toujours déclarer cette propriété LocationPoint en tant que CLLocation sans erreur:

@property (nonatomic, strong) CLLocation *location

Plus d'infos ici .

0
PostCodeism