12
votes

Comment utiliser les données de base pour récupérer une liste des lieux commandés par la distance

J'ai une application iPhone basée à CoreData et j'ai une entité qui a latitude et la longitide de longitude en tant que propriétés. Comment puis-je retourner toutes mes entités commandées par la distance de l'emplacement actuel? Je préside que cela a fait cela sans Coredata qui écrit une requête SQL, mais je suis nouveau à Coredata et ne peut pas le comprendre. J'aimerais utiliser le NsfetchedResultController pour passer directement à ma tableView.

Toute aide s'il vous plaît?


0 commentaires

3 Réponses :


1
votes

Eh bien, voici le problème: lorsque vous exécutez un nsfetchrequest , vous ne pouvez baser que le prédicat sur les propriétés persistantes. Il semble extrêmement improbable que vous auriez une propriété persistante qui suit la distance entre l'emplacement actuel.

Vous pouvez ajouter une propriété transitoire à votre entité qui donne la distance par rapport à un emplacement défini dans le monde entier. Vous devriez faire une demande de récupération qui obtient tous les objets, puis commandez-les par cette propriété transitoire.

Si vous avez beaucoup d'objets, vous risquez de remplir votre mémoire assez rapidement. Et même si vous ne le faites pas, vous finirez toujours par perdre du temps à chercher des objets que vous n'allez jamais utiliser.

Je suppose que vous avez probablement eu une instruction Nifty SQL SELECT Compatible la distance actuelle de votre version précédente. Vous ne pourrez pas répliquer cela avec des données de base.


1 commentaires

Je pensais que ce serait le cas, bien que je puisse peut-être passer dans une fonction de tri qui a été calculée contre le lat et la longue, mais cela semble que vous ne pouvez pas. Tout semblait trop beau pour être vrai :-) Si j'utilise Sqllite, je suppose que je peux contourner Coreedata et coller avec ma requête SQL. Merci.



2
votes

J'ai une situation similaire - et bien que ce qui précède soit vrai en ce qui concerne ne pas pouvoir utiliser le NsfetchedResultController, vous pouvez toujours utiliser des données de base pour récupérer vos données.

J'ai aussi utilisé SQLite3 avant - et ma récupération a été effectuée comme une série d'extratures de tailles de boîte à bornes augmentes - jusqu'à ce qu'une taille soit atteinte où j'ai des résultats "assez". Dans mon cas, je double la latitude et la longitude de la longitude pour chaque itération - donnant env. un quadruplement de la zone pour chaque itération.

Cette méthode fonctionne également dans les données de base également - mais comme cela est également indiqué ci-dessus, vous devez copier les objets dans un nouveau tableau et les trier à l'aide de votre propre méthode après la vérification de la récupération.


1 commentaires

Je pense que je finirai de faire quelque chose comme ça. Je suppose que je devrai faire un peu de travail au lieu de tout obtenir gratuitement :-) Utiliser SQL directement avec Coredata me fait mal malade.



9
votes

Dans mon expérience La meilleure façon de le faire est de calculer la distance de chaque entrée sur la première charge (ou du changement d'emplacement) et de sauvegarder cette propriété vers CoreData, de cette façon, vous pouvez facilement récupérer des entrées à l'aide de la propriété de distance.

Voici un extrait de code qui calcule la distance entre 2 séries de coordonnées: xxx


1 commentaires

Ceci combiné à une tâche d'arrière-plan à mettre à jour après des changements d'emplacement importants est une excellente solution.