2010-02-28 4 views
6

Nous construisons une application Android qui utilisera l'emplacement actuel de l'utilisateur (lat, long) et affichera le top 50 lieux autour de l'emplacement actuel, triés par distance.Sqlite sur Android: Comment créer une fonction sqlite dist db - à utiliser dans l'application pour le calcul de distance en utilisant lat, long

Nous avons ces sites stockés dans une base de données SQLite. Nous prévoyons d'expédier avec la base de données sqlite avec l'application. Afin de ne récupérer que les 50 lieux les plus proches, nous voulons définir une fonction db DIST (pour calculer la distance entre deux points) et l'utiliser dans notre requête. Comment puis-je définir une fonction SQLite personnalisée pour Android Apps?

Quel sera l'appel de l'API Java pour cela?

Nous avons mis en place avec succès cette approche dans notre iPhone - en utilisant Objective C.

+0

http://stackoverflow.com/questions/3126830/query-to-get-records-based-on-radius-in-sqlite – Pentium10

+0

bonjour comment avez-vous intégré cela sur ios ?? parce que je dois faire la même chose, merci –

Répondre

5

Mise à jour: La réponse est que vous ne pouvez pas le faire.

de: Android. Is it possible to write custom function on C/C++ and use it in SQL query?

+0

Josh, Merci! Si cela ne vous dérange pas, pourriez-vous s'il vous plaît me diriger vers un exemple de code - je serais alors sûr de ne pas faire une erreur. Merci beaucoup! – Puneet

+2

org.sqlite n'est pas une API Android, ce qui n'est pas pertinent. – hackbod

+1

Vous avez raison, org.sqlite n'est pas une API Android. Cependant, vous pouvez l'utiliser pour implémenter un fournisseur de contenu qui fait ce qu'il a demandé. –

0

Il peut être fait, mais vous ne pouvez pas charger cela dans la base de données de l'API Java. Vous devrez fournir votre propre implémentation de la bibliothèque sqlite étendue pour fournir les fonctions que vous souhaitez au niveau C. Ce n'est pas amusant mais ça marche bien. Sachez que vous pouvez rencontrer des problèmes avec les appareils Android utilisant des architectures non standard.

1

Une solution de contournement peut être d'extraire tous les enregistrements dont l'une des valeurs (disons, la longitude) est proche de l'emplacement actuel. Si vous utilisez cette colonne comme un index, la récupération de ceux-ci sera très rapide. Ensuite, vous avez un sous-ensemble beaucoup plus réduit pour itérer en comparant les latitudes et en effectuant vos calculs de distance totale.

0

Je sais que c'est une vieille question, mais il y a une solution un peu plus facile je pense.

Ceci est un exemple, mais il échoue lors de la traversée de 0 degré, bien que vous puissiez déplacer toutes les latitude/longitudes à ajuster.

La solution globale fonctionne assez bien pour la commande, mais utilise simplement le théorème de Pythagore pour calculer la distance relative (note: pas de fonction racine carrée dans sqlite, mais cela n'est pas pertinent).

String calcDistance = "(((abs(" + cLat + ") - " + Math.abs(lat) + ") * (abs(" + cLat + ") - " + Math.abs(lat) + "))" + 
        "+ ((abs(" + cLng + ") - " + Math.abs(lng) + ") * (abs(" + cLng + ") - " + Math.abs(lng) + "))) as calc_distance"; 

Si vous avez besoin de fixer cette distance, vous voulez régler en ajoutant 90 à toutes les latitudes et 180 à tous longitude. Ensuite, vous pouvez vous débarrasser de ces fonctions abs désagréables.