Comment stocker CLLocation à l'aide de Données de Base (iPhone)?
Je suis en train d'enregistrer un emplacement et de récupérer l'emplacement sur une carte par la suite à l'aide de l'Emplacement de Noyau, MapKit et de la Base de Données des cadres.
Ce que j'ai fait c'est que je viens de faire entité nommée PI et les propriétés ajoutées comme la latitude (de type double), longitude (de type double) avec quelques autres.
Tout simplement, mon app enregistre PI avec deux NSNumbers. (lat et long), mais je me sens comme il doit y avoir une façon plus intelligente pour stocker CLLocation que cela.
acclamations.
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites est bien. Vous devez enregistrer la latitude et la longitude en double dans la Base de Données. Lorsque vous avez besoin pour obtenir à nouveau les informations, obtenir le double de retour à partir de Données de Base et de construire une
CLLocationCoordinate2D
struct avec une fonction commeCLLocationCoordinate2DMake
. Il n'y a pas construit dans le moyen de stocker de l'emplacement, de sorte que le stockage de la latitude et la longitude des composants est très bien.Si vous n'êtes pas d'effectuer toutes les opérations de calcul de la latitude et de la longitude (trouver les cases etc), vous pouvez stocker des chaînes de caractères. Des flotteurs et des doubles peuvent modifier leurs valeurs légèrement, ce qui rend la comparaison des opérations échouent.
CLLocation met en œuvre la NSCoding protocole, de sorte que vous pouvez les stocker dans la Base de Données comme transformables attributs. Vous pouvez utiliser la valeur par défaut NSKeyedUnarchiveFromData valeur transformateur.
Vous venez de passer le CCLocation objet pour la gestion des attributs de l'objet et il serait sérialiser des données et l'enregistrer comme une tache dans le SQL magasin. Lorsque vous avez besoin de l'emplacement de l'objet, il serait automatiquement inverser le processus et de revenir à vous une entièrement rempli CCLocation objet.
Que peut-être la façon la plus simple d'obtenir ce que vous voulez.
La "meilleure" façon de stocker cela dépend de ce que vous voulez faire avec elle:
Il y a un tas de propriétés supplémentaires, vous pouvez sauvegarder/restaurer si vous le faites manuellement (altitude, horizontalAccuracy, verticalAccuracy, timestamp). Il ya un peu plus que vous ne pouvez pas (vitesse, cap); CLLocation ne pas fournir une bonne init-méthode et les propriétés sont en lecture seule.
Toutes les propriétés supplémentaires sont utiles si vous êtes l'enregistrement d'une piste. L'Altitude est utile si vous effectuez l'enregistrement d'un POI sur un terrain montagneux ("nous avons encore à gravir 100 m"). horizontale/verticale de précision peuvent être utilisés pour représenter la taille de la PI est (par exemple, une ville peut avoir une "précision horizontale" de plusieurs km et l'afficher comme un grand cercle).
Vous pouvez le faire très simplement par le réglage de la Base de Données de l'attribut type de
Transformable
. La valeur par défaut transformateur si vous laissez le Valeur Transformateur Nom vide estNSKeyedArchiver
qui fonctionne avec la plupart des types de base tels que NSURL et CLLocation.Vous n'avez pas besoin d'utiliser NSNumber pour stocker la latitude et la longitude des points. Vous pouvez stocker CLLocation directement à la base de données à la place.
Mis en place une entité pour chaque CLLocation, ça va être un trop-beaucoup de relation hors quelle que soit l'entité est à l'aide de points de localisation. Appelons cette LocationPoint:
Vous définissez ensuite la emplacement propriété transformable en Xcode modèle de données. Ça y est!
En Objective-c, vous pouvez effectivement encore déclarer cette LocationPoint propriété CLLocation sans erreur:
Plus d'info ici.