|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Conexión con una base de datos externa
Buenas,
Soy novato en el foro y también en el desarrollo Android. Después de pasar por toda la fase de aprendizaje inicial (layouts, listeners, etc) ya estoy empezando con proyectos más complejos, de los que cuesta más encontrar información. De aquí me surgen un par de dudas: 1) Si quiero hacer una aplicación con la clasificación de una liga, tengo entendido que hay dos principales alternativas: 1.1) Lector RSS Feed: Sé que mediante los Feeds de por ejemplo los blogs, se puede conseguir información, pero hay alguna forma de que mi aplicación coja por ejemplo los datos de la clasificación de MARCA.com? O de otra página que no tenga un RSS explícito para una determinada clasificación. 1.2) Base de datos: Suponiendo que no puedo obtener de ninguna forma la información de esa web. La otra alternativa sería crear una BD en MySQL que yo actualizara manualmente? Supongamos que yo creo la tabla en una BD en MySQL. Luego como debo hacer para reflejar dicha tabla en mi app? He leído algo sobre JSON, y demás. No sé si tendría que copiar los datos a una SQLi de la propia aplicación, o reflejar directamente de la tabla. Si alguien pudiera explicarme como funciona este tipo de recopilación de datos de una BD externa y si pudierais pasarme tutoriales o links con ejemplos o documentación específica de este tema, se agradecería muchísimo. 2) Supongamos que tengo una BD en MySQL con una tabla de "Ubicaciones" con su nombre, longitud, latitud (y algún atributo más que pueda necesitar). Quiero hacer que mi aplicación me muestre las cuatro localizaciones de dicha tabla más cercanas a mi posición actual, como debería hacerlo? 2.1) Debo crear una SQLi para la app que se vaya actualizando constantemente de mi BD y que a la hora de buscar use únicamente su SQLi o mejor voy a buscar los datos cada vez en la BD MySQL? (Si tengo por ejemplo 10000 localizaciones, quizás ocupa muchos datos la aplicación si uso una SQLi, o vale la pena tener esos datos ya almacenados para no acceder cada vez a la base externa???). 2.2) Como puedo obtener esas cuatro localizaciones más cercanas? He hecho consultas básicas en SQL con una o varias tablas, y cosillas del estilo (UPDATE, SELECT, DELETE, etc), pero para encontrar las cuatro localizaciones más cercanas en una BD que puede tener 1000 o 10000 localizaciones, como podría conseguirlo? Con los datos de una ubicación actual de Google Maps puedo determinar una ciudad-pueblo y así tener la BD organizada y reducir muchísimo el tiempo de búsqueda? Por poner un ejemplo que se me ocurre. Un saludo y agradecería muchísimo ayuda con ambas dudas, he practicado con aplicaciones simples y he ido subiendo cada vez más la complejidad, pero ahora ya me cuesta mucho aprender cosas así, y más me cuesta encontrar documentación relacionada. Muchas gracias ![]() ![]() ![]() |
|
#2
|
||||
|
||||
No se si te habras pasado por aqui: http://www.htcmania.com/showthread.php?t=465896
Estamos con un tema parecido que quizas te pueda interesar la informacion. |
#3
|
||||
|
||||
Si si me he pasado. Pero me pareció entender a simple vista que vosotros ya domináis eso del JSON. Yo no tengo ni idea, es la primera vez que escucho esta palabra. Por eso mi intención era a ver si alguien me podía pasar enlaces para aprender/practicar desde lo más básico del tema. De hecho la pregunta viene a raíz de leer ese hilo primero, jejeje.
Aunque si te soy sincero, me interesa mucho más la resolución de mi segunda duda, esa aplicación la tengo a medias, ahí parada porque no sé como seguir. Es más, como ya te he dicho esa primera duda surge de leer el hilo ese. De todas formas, muchas gracias. Un saludo, y sigo esperando la ayuda de algún experto, :P :P |
#4
|
||||
|
||||
2.2) Como puedo obtener esas cuatro localizaciones más cercanas? He hecho consultas básicas en SQL con una o varias tablas, y cosillas del estilo (UPDATE, SELECT, DELETE, etc), pero para encontrar las cuatro localizaciones más cercanas en una BD que puede tener 1000 o 10000 localizaciones, como podría conseguirlo?
![]() $query = "SELECT *, ((ACOS(SIN(($lat / 1000000) * PI() / 180) * SIN((location_lat / 1000000) * PI() / 180) + COS(($lat / 1000000) * PI() / 180) * COS((location_lat / 1000000) * PI() / 180) * COS((($lon / 1000000) - (location_lon / 1000000)) * PI() / 180)) * 180 / PI()) * 60 * 1.853159616) AS `distance` FROM `tabla` ORDER BY `distance` ASC LIMIT 4"; |
#5
|
||||
|
||||
1)
Tenía pensado hacer la conversión a antes de guardarlo en la BD, pero es cierto que me saldrá más rentable trabajar tal cual. 2) Me puedes explicar un poquito esa declaración? Después del SELECT* ya me pierdo. SIN, ACOS, COS, PI?? Todo eso son las funciones matemáticas (arc coseno, seno, número pi?)??? Están implementadas tal cual en SQL? Me puedes explicar un poco que son todos esos cálculos y el porque? Después el FROM, GROUP BY etc bien. Lo único que nunca había usado el ASC_LIMIT (solo he usado el ASC individualmente), pero vamos parece intuitivo y fácil de usar. 3) He pensado que quizás sería más útil limitar la distancia (imagina que estoy en Madrid y la localización mas cerca de las de mi BD está en Barcelona, tampoco serviría de mucho, si fueran por ejemplo Bares) Por eso he pensado que podría hacer el cálculo de distancia y coger todos los que estén a una cierta distancia máxima. Este método si sabía implementarlo (mi principal problema era que desconocía ese ASC_LIMIT 4 y no sabia como coger cuatro, pero vamos ahora que me lo has explicado puedo mezclar las dos cosas (cuatro más cercanas, pero con un máximo de distancia). De todas formas, tendré que calcular si o si las distancias así que agradecería que me explicaras un poquito esos cálculos para poder implementarlos. Un saludo, y muchísimas gracias, de verdad se agradece ;) |
#6
|
||||
|
||||
Los cálculos en el SELECT sirven para a partir de las coordenadas en la que estás obtener las distancias a las coordenadas almacenadas en la BD. Por eso usa funciones trigonométricas. Y si están implementadas en SQL (por lo menos en la mayoría de motores actuales).
En cuanto al LIMIT 4 sirve para que el SELECT sólo te devuelva los 4 primeros resultados, y es algo que varía entre distintos motores de SQL, por ejemplo en los motores de Microsoft (JET y SQLServer) la instrucción es TOP. En MySQL incluso funciona de lujo para hacer un UPDATE, si las condiciones las cumplen muchas filas pero sólo quieres actualizar 2 (te da igual cuales) poniendo LIMIT 2 al final lo hace. |
#7
|
||||
|
||||
Muchas gracias. Pero alguien podría explicarme los pasos de los cálculos?
Te agradezco la explicación kriogeN porque en clase solo hemos usado Postgres y hemos visto los motores como algo teórico. Esta bien ver ahora a la hora de la práctica como cambian las sentencias. Ahora solo falta a ver si alguien puede desglosar explícitamente esos cálculos, y estarán todas las dudas del hilo resueltas. Un saludo y muchas gracias. Como siempre digo, se agradece un montón que haya gente que colabora como ustedes. |
#8
|
||||
|
||||
Todo ese lío de SIN, COS, ACOS y PI es un "simple" cálculo que con dos pares de coordenadas te devuelve la distancia aproximada en línea recta teniendo en cuenta la curvatura (también aproximada, la tierra no es esférica) del planeta.
|
#9
|
||||
|
||||
Vale. Solo me falta saber una cosa. En principio dibujar puntos en el mapa a partir de una "lat" y una "lon" ya sé.
El problema es: Yo tengo esos datos en una MySQL externa. Supuestamente hago esta consulta desde mi aplicación (sabéis de algún tutorial de ejemplo?), y por lo que sé de SQL eso te devuelve otra tabla. En ese caso con cuatro registros y que son las cuatro localizaciones. Como trabajo con esos datos? Los copio de la MySQL externa a una SQL interna y de ahí los cojo? Que otras formas hay? Agradecería algún tutorial relacionado, si lo existe claro. Espero opiniones. Gracias. |
#10
|
||||
|
||||
Si tienes latitud y longitud (en 1E6, como le gusta a Google):
$query = "SELECT *, ((ACOS(SIN(($lat / 1000000) * PI() / 180) * SIN((location_lat / 1000000) * PI() / 180) + COS(($lat / 1000000) * PI() / 180) * COS((location_lat / 1000000) * PI() / 180) * COS((($lon / 1000000) - (location_lon / 1000000)) * PI() / 180)) * 180 / PI()) * 60 * 1.853159616) AS `distance` FROM `tabla` ORDER BY `distance` ASC LIMIT 4"; ![]() Muchas gracias. |
![]() |
![]() |
||||||
|
Herramientas | |