Professional Documents
Culture Documents
Mi base de datos esta compuesta por una tabla "personas" con los
siguientes campos:
DNI---Varchar
Nombre--Varchar
Telfono--Varchar
Email.--Varchar
Uno o varios WebService (segn necesitemos). Yo voy a utilizar 2:
Insert.php
selectAll.php
Una conexin mediante la clase HttpClient de la API de Apache
No hay que agregar libreras, esta API va incluida en el repositorio android.
Ejecutarlo todo mediante hilos AsyncTask.
A partir de la versin 3 o superior, correrlo todo en AsyncTask es
obligatorio.
Bueno, sabiendo esto, creamos un nuevo proyecto con su respectiva activity.
Mi activity va a ser muy simple:
Bien, una vez tengamos nuestro diseo, nos vamos a nuestra clase.
Lo primero es ligar nuestra clase con el archivo xml y sus componentes:
Una vez hecho todo lo anterior vamos a crear un mtodo que enve la informacin que
introducimos en los campos a nuestroWebService para que este se lo comunique al
servidor y obtener una respuesta.
Bueno, no os asustis de ver tanta linea, ante todo saber que solo trabajamos con 2
clases y un ArrayList:
HttpClient: Clase encargada de enviar la informacin almacenada en httpPost a
nuestro WebService.
HttpPost: almacena los datos que sern enviados, por medio de HttpClient, a
nuestro WebService.
List: Almacena objetos de tipo "NameValuePair" el cual almacena por constructor
(NameValuePair es una interfaz la cual implementa la clase BasicNameValuePair ) una
variable y el valor que contendr dicha variable, las cuales son las que obtendr
nuestro WebService.
Veamos:
Implementamos las clases con las que vamos a trabajar:
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR")
Yo tengo puesto la ip local de mi pc, ya que si ponemos localhost o
127.0.0.1, el dispositivo va a buscar su propio localhost, el que va incluido en el mvil, y
puede crear errores, lo mejor si estas probando, la ip local de tu pc. Si utilizas el emulador
que trae el eclipse SDK android, tendrs que poner 10.0.0.2, ya que si no te dar fallo.
Veamos, este es nuestro WebService, un archivo escrito en PHP que interactua con
nuestro servidor, su funcionamiento sera de la siguiente manera:
Rellenamos las variables del localhost con la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Nos volvemos a nuestra clase, y creamos una clase interna que herede de AsyncTask:
Bien, deciros que no voy a utilizar JSON para obtener los datos, si no que crear una
clase Personas donde ir almacenando los datos de cada persona, para posteriormente
guardar ese objeto "Persona" en un ArrayList. Esta forma de hacerlo quizs no sea la
ms correcta, pero es suficientemente vlida como para explicarla. La forma correcta
sera utilizando JSON, pero no quiero complicar ms el tema.
Empecemos, aqu os dejo la clase, el archivo .xml y el webservice de la PARTE 1, por si
no lo tenis:
WebSeviceExample
Bien, lo primero que haremos ser agregar una nueva clase Personas, la cual tendr
como atributos:
Nombre
DNI
Telefono
Email
Una vez la tengamos creada, nos vamos a nuestra clase y creamos nuevos atributos que
vamos a utilizar:
private int posicion=0;
private List listaPersonas;
Esta lista la iniciamos en el mtodo onCretae():
listaPersonas=new ArrayList();
Posteriormente creamos un mtodo para obtener los datos del WebService:
Veamos, este cdigo cambia ligeramente con respecto al mtodo insertar que creamos
en la PARTE 1.
Este mtodo es de tipo String, por lo tanto nos devolver una String con los
resultados obtenidos de nuestro servidor.
Creamos una variable local de tipo String llamada resquest, esta almacenar la
respuesta.
String resquest="";
Instanciamos HttpClient y HttpPost para comunicarnos con nuestro Webservice.
HttpClient httpclient=new DefaultHttpClient();
HttpPost httppost=new HttpPost("URL DE NUESTRO WEBSERVICE
EN EL SERVIDOR");
Con respecto a nuestro mtodo "ingresar", no vamos a crear un ArrayList para
almacenar datos y pasrselos al servidor, ya que es el servidor el que nos tiene que pasar los
datos.
Tampoco vamos codificar datos, ya que no tenemos datos que codificar.
Creamos un objeto de la clase ResponseHandler, ya que para que nos de una
respuesta el webservicedebemos de pasarle este handler al
mtodo excute() de HttpClient por parmetro para que nos devuelva los datos.
ResponseHandler responseHandler=new BasicResponseHandler();
Le decimos a HttpClient que ejecute la peticin a nuestro webservice, y este nos
devolver una String, la cual almacenamos en resquest:
resquest=httpclient.execute(httppost, responseHandler);
Bien, ya tenemos el cdigo para obtener los datos del servidor, veamos que es lo que
hace nuestro Webservice cuando conectamos con l.:
Como podis observar, cambia poco con respecto a nuestro WebService "insert.php":
Lo primero es meter la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.
Posteriormente nuestro WebService intentar conectar al servidor, enviando un
informe de error en caso de no porder conectar:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, intentar conectar con nuestra base de datos
mysql_select_db($database_localhost, $localhost);
Luego, creamos una sentencia sql para que obtenga todos los datos del servidor.
$query_search = "select * from personas order by dni";
Ejecuta la sentencia sql:
$query_exec = mysql_query($query_search) or die(mysql_error());
Finalmente, y mediante un bucle WHILE nos ir imprimiendo los resultados.
while($row = mysql_fetch_array($query_exec)){
echo $row['nombre']."
".$row['dni']."
".$row['telefono']."
".$row['email']."/";
}
Cerramos la conexin:
mysql_close($localhost);
Decir que la barra al final del echo "/" y los "br", los pongo para filtrar y descomponer la
informacin que me enva el servidor, ya que este me manda una String con todas las
filas, y yo las filtro para poder manejar los datos individualmente.
Bien, ya sabemos como funciona nuestro WebService y tenemos almacenada la
informacin del servidor, ahora vamos a crear un mtodo que nos filtre los resultados y
nos lo almacene en objetos:
Veamos:
Creamos un mtodo booleano que en caso de no obtener resultados de
nuestro WebService retornar false y en caso de obtener resultados, lo descompondr, lo
almacenar y retornar true.
Limpiamos nuestro ArrayList por si tuviese algo de informacin.
listaPersonas.clear();
Ahora creamos una condicin if para comprobar que nuestro resultado contiene
informacin para poder continuar.
if(!mostrar().equalsIgnoreCase(""))
Si la condicin es cierta, pasamos el primer filtro separando la informacin por
bloques utilizando como elemento separatorio la barra "/"
String [] cargaDatos=mostrar().split("/");
Acordaos de que nuestro webservice imprima una barra "/" cada
vez que mostraba una fila, es la que utilizo para el split.
Tenemos las filas almacenadas en un array, pero cada posicin del array almacena
una String con todos los datos de la persona, por lo tanto le vamos a pasar un segundo filtro
para almacenar finalmente los datos de forma individual.
Creamos un for que recorra nuestro array "cargaDatos".
for (int i = 0; i < cargarDatos.length; i++) {
Por cada posicin del array lo descomponemos con otro split, en este caso
utilizaremos br para nuestro split.
String datosPersona[]=cargarDatos[i].split("<"br">");
Este mtodo no tiene mucha historia, le pasamos una posicin por parmetro y, corriendo
en un hilo, nos busca el objeto almacenado en la posicin indicada y lo muestra en
nuestro formulario.
Finalmente lo ejecutamos todo en nuestro AsyncTask:
Ya con todo, nos vamos a nuestro botn mostrar y le damos una accin:
Bien, primero voy a modificar mi archivo xml para que quede de la siguiente manera:
constructor. Agregamos a nuestro ArrayList un objeto de este tipo segn el tamao que le
hayamos dado.
Una vez almacenados los datos, le pasamos el ArrayList a nuestra
clase HttpPost para que lo codifique:
httppost.setEntity(new UrlEncodeForEntity(nameValuePairs));
Bueno, una vez que lo tenemos codificado con la url del webservice y la
informacin de nuestro ArrayList, hacemos que HttpClient lo enve:
httpclient.execute(httppost);
Ahora vamos a ver como trabaja nuestro WebService:
Como nuestro botn insertar, primero comprueba que no haya campos vacos,
posteriormente, y si los campos no estn vacos, comprueba que exista el dni, y si todo
ha ido bien, nos ejecuta nuestro cdigo update, si no, nos mostrar por pantalla
un Toast con el tipo de error.
Bien amigos, hasta aqu la opcin para actualizar los registros de nuestra base de datos.
Aqu os dejo el .xml, la clase y el php: WebServiceCodeExamplePARTE3
Continuaremos con la PARTE 4.
Un saludo.
Bueno, si hemos seguidos todas las partes de este tutorial, esto tiene que estar
dominado, vara muy poco entre unas cosas y otras.
Cmo veis, el webservice tambin cambia poco con respecto a los anteriores:
Rellenamos las variables del localhost con la informacin de nuestro servidor:
Hostname: Nombre del host.
Database: Nombre de nuestra base de datos.
Username: Nombre de usuario del servidor.
Password: Contrasea del servidor.
Posteriormente, con los datos de servidor que hemos introducido, le pedimos que
conecte al servidor y almacene la respuesta en otra variable:
$localhost=mysql_connect($hostname_localhost,
$username_localhost,$password_localhost)
Si no puede conectar enviara un informe de error
or trigger_error(mysql_error(),E_USER_ERROR);
Una vez conectado al servidor, buscar nuestra base de datos y se conectar:
mysql_select_db($database_localhost, $localhost);
Posteriormente, y una vez encontrada la base de datos, obtendr la variable que le
pasamos por nuestra aplicacin y las almacenar en otra variable que pueda manejar mejor.
$dni=$_POST['dni'];
Almacenada la variable, introduce el valor en un sentencia sql para realizar una
consulta al servidor:
$query_search = "delete from personas where dni='".$dni."'";
Finalmente, y si todo ha ido bien, realizar la consulta a nuestro servidor, el cual,
en caso de fallar la sentencia, nos enviar un informe de error.
$query_exec = mysql_query($query_search) or die(mysql_error());
Cerramos la conexin.
mysql_close($localhost);
Ahora, y como ya deberas saber, vamos a crear una clase AsyncTask para que ejecute
nuestra conexin en segundo plano:
Bien, con esto ya podramos eliminar los registros de nuestra base de datos.
Continuaremos en la PARTE 5
Aqu os dejo la clase, el archivo xml y el PHP: WebServiceCodeExampleParte4
Un saludo a todos.
Bien el tema en s es un poco complejo pero con un poco de orden podemos lograrlo
hacer muy fcilmente. Decir, antes de continuar, que tambin he creado una nueva tabla
en la base de datos llamada "imagenes", la cual la componen un campo ID(primary key
y auto incremento) y un campo imagen (Varchar) donde almaceno el nombre, OJO, no
la ruta, el nombre de la imagen.
Antes de empezar agregamos permisos a nuestra aplicacin:
Tras realizar nuestro .xml nos vamos a nuestra clase y declaramos los atributos que
vamos a necesitar:
Una vez llegados hasta aqu creamos un mtodo para activar la cmara del dispositivo:
Esta accin comprueba que el Edittext nombreImagen no est vaco, si lo est, nos
manda un Toast de aviso, si no, iniciar la cmara.
Con todo esto ya podremos hacer fotos e ir mostrndolas en nuestro ImageView.
Para subir nuestra imagen a servidor necesitaremos:
1.
Un mtodo que conecte con un WebService
2.
Un WebService que guarde nuestra imagen.
3.
Una clase AsyncTask para ejecutarlo todo.
Nuestro mtodo quedara de la siguiente forma:
WebService InsertImagen.php
Antes de nada voy a ir enumerando los componentes que nos harn falta:
1.
Librera JakeWharton Android ViewPagerIndicator
2.
Un archivo xml donde colocaremos el diseo de nuestra activity
3.
Un archivo xml que contendr un ViewPager y un TitlePageIndicator
4.
Un archivo .java que herede de Fragment
5.
Un archivo .java que herede de FragmentActivity
6.
Una clase PageAdapter para crear las distintas activitys
7.
Una clase DepthPageTransformer que nos proporciona google
Bien, todos estos archivos los podis descargar al final des tema.
En la nueva ventana que se nos abre pulsamos sobre "Android Project from
Existing Code"
Una vez la librera este aadida vamos a realizar nuestras 2 archivos xml:
El primer archivo xml est compuesto por un ViewPager y un TitlePagerIndicator
El segundo xml que voy a utilizar va a ser el mismo que utilic para el tema de subir
imagen a servidor sin darle ninguna funcionalidad, solo quiero que veis como se desliza
la screen al pasarla con el dedo, el darle funciones es cosa vuestra.
Bien, teniendo ya nuestros archivos xml creados vamos a empezar a crear clases,
necesitaremos 4:
MyFragmentPagerAdapter
Bueno, algo que no he explicado son los fragments, estos se comportan como
en html los div o capas, es decir, son un conjunto de activitys que se pueden unir o
acoplar para formar una activity ms completa.
Bien, no es algo que vayamos a profundizar aqu, pero para que os orientis.
Dicho esto, esta clase que hemos creado heredar de FragmentPageAdapter y
almacenar en un list de fragment losfragments que le vayamos pasando por
constructor.
list
}
El tercer mtodo es sobreescrito y nos devuelve la cantidad de elementos que hay
almacenados en nuestro list.
@Override
public int getCount() {
return this.fragments.size();//Obtenemos el tamap de nuestra list
}
El cuarto mtodo es sobreescrito, y da un titulo a cada fragment segn posicin.
@Override
public CharSequence getPageTitle(int position) {
String s="";
switch(position){
case 0: s="Pestaa 1";
break;
case 1: s="Pestaa 2";
break;
case 2:
s="Pestaa 3"; break;
case 3:
s="Pestaa 4";
break;
}
return s;
}
Esta clase no tiene ms explicacin, es muy sencilla.
DepthPageTransfomer
Bueno esta clase nos la proporciona google junto con ZoomOutPageTransformer y su
funcin es darle una animacin a nuestros fragments mientras deslizamos la pantalla. No
voy a explicarla, ya lo hace muy bien google, solo tenis que copiarla y agregarla al
proyecto, de todas maneras, yo la dejar al final del tema junto al resto de archivos.
Podis verla aqu
ViewPagerFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.activity_image_upload, container, false);
return rootView;
}
Vuelvo a repetir, no le voy a dar accin, solo quiero que veis como hace slide al
pasar el dedo.
ViewPagerExampleActivity
Bien, esta clase es la importante, la que nos va a hacer funcionar. Podis observar que
esta clase hereda deFragmentActivity. Esta clase formara una activity con todos
los fragments que le pasemos.
Lo primero que vamos a hacer es abrir nuestro SDK Manager para descargar una librera
del repositorio degoogle.
Posteriormente nos vamos al final del todo, a la carpeta "extras" y marcamos "Google
Play Services"
NOTA: Cuidado con instalar paquetes que no queris, puede influir en el funcionamiento de
eclipse.
Una vez descargada, vamos a agregarla como librera Android a nuestro proyecto:
En la ventana que se nos abre, buscamos la ruta donde este nuestra librera "Google Play
Services". Tenis que ir a la carpeta donde tengis vuestro sdk, y dentro seguir la
ruta"sdk\extras\google\google_play_services\libproject\google-play-services_lib"
Una vez tengis vuestra librera agregada, pinchis sobre vuestro proyecto y
elegs "preferences", posteriormente, en la ventana que se abre, pinchis en "android" y abajo a la
derecha podis agregar la librera a vuestro proyecto
Una vez tengamos la librera, debemos registrar nuestra app y obtener una clave Google Maps para
poder utilizarla en nuestra aplicacin.
NOTA: Esto lo hace google para mantener cierto control, ya que una app que al utilizar ms de
25.000 veces Google Mapsdebe de empezar a pagar una cantidad de dinero (pequea) por cada vez
que se utilice de ms Google Maps. Esto no supone un problema para una persona con una app,
pero si que lo es si 30.000 personas tienen la app y utilizan a menudoGoogle Maps.
Bien, para obtener una clave para utilizar Google Maps, necesitaremos un cdigo cifrado en SHA1 que nos proporciona el mismo eclipse:
Bueno, ahi os aparecer vuestro cdigo en SHA-1, lo copiis en un bloc de notas, para utilizarlo
posteriormente.
Ahora, vamos a ir a Google Developer Console
Una vez en la pagina, pinchis sobre "API Access" y posteriormente pinchis sobre "Create new
Android Key"
En esta nueva ventana que se abre debis poner vuestro cdigo SHA-1 seguido de punto y
coma ";" y el nombre de nuestro proyecto, quedando de la siguiente forma:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX;com.example.picarcodig
o (todo junto).
Bueno, copiis vuestra key en un bloc de notas para utilizarla posteriormente, vamos a generar algo
de cdigo.
Lo primero que debemos hacer cuando creemos nuestro proyecto es agregar permisos a nuestra
aplicacin:
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.WRITE_EXTERNAL_STORAGE
com.google.android.providers.gsf.permission.READ_GSERVICES
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
Google Maps utiliza OpenGl para renderizar mapas, si no tenis instalado OpenGl, es
obligatorio ponerlo.
Ahora, continuando con nuestro manifest, debajo de donde tengamos declarada nuestra
activity, aadimos 2 meta-data.
En "android:value" del primer meta, pegis, entre comillas, vuestra clave, quedando de
la siguiente manera
Con esto ya, podemos trabajar con Google Maps en nuestra app.
Bien, ahora vais a vuestro archivo xml y agregis lo siguiente:
Bien, esto no necesita mucha explicacin, un fragment donde nos cargar nuestro mapa.
Vamos a ir ahora a nuestra clase para darle funcionalidad.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(murcia,
2.0f));
Si tenemos filas en nuestra tabla, se ejecutar un bucle "while" donde por medio
del mtodo mysql_fetch_associremos almacenando las filas en la variable $row
while($row=mysql_fetch_assoc($query_exec))
Y se lo pasamos a nuestra variable $json para que lo almacene para
posteriormente envirselo a nuestra app.
$json['personas'][]=$row;
Cerramos la conexin con el servidor
mysql_close($localhost);
Imprimimos por medio de echo nuestro $json con ayuda del
mtodo json_encode.
echo json_encode($json);
Ahora vais a vuestro navegador y comprobis que funciona, introduciendo la url
del "selectAllJSON.php" (as se llama mi webservice).
En mi caso la url sera: http://localhost/picarcodigo/selectAllJSON.php
Y lo que me imprime por pantalla sigue el formato JSON:
{"personas":[{"nombre":"Bartolome Abellan","dni":"55578932Z
z","telefono":"555789000","email":"bartolomeabellan@gmail.com"},
{"nombre":"cgghj","dni":"ghjj","telefono":"3689","email":"ghjkog"},
{"nombre":"ghkjf","dni":"hdguj","telefono":"5699","email":"gghk"}]}
Bien, ya tenemos listo nuestro WebService con JSON integrado veamos como quedar
nuestra app.
Lo primero es crear una clase "Personas" en las que almacenaremos los datos de cada
persona:
NOTA:No voy a explicar esta clase, si no sabes que hace o cual es su funcin, debes
estudiar ms, es algo bsico.
Voy a trabajar en mi app con esta interfaz, la cual pasar al final del post.
Bien, ya tenemos nuestro webservice y sabemos con que interfaz trabajar, vamos a ver
cdigo java.
Este mtodo no lo he creado yo, lo he cogido de internet, los hay a patadas y es la mejor
solucin para pasar datos de unInputStream a String, es muy sencillo.
Bien, hemos ledo nuestro WebService y hemos almacenado su valor en la variable
resultado, ahora vamos a pasarlo ese resultado por nuestro mtodo filtrarDatos().
personas.setDni(jsonArrayChild.optString("dni"));
personas.setNombre(jsonArrayChild.optString("nombre"));
personas.setTelefono(jsonArrayChild.optString("telefono"));
personas.setEmail(jsonArrayChild.optString("email"));
Fijaos bien que cuando llamo a jsonArrayChild.optString("dni"), le vamos a
pasar a personas el valor almacenado en dni, e igual para los otros casos
Posteriormente agregamos el objeto personas a nuestro ArrayList
listaPersonas.add(personas);
Con esto ya tendramos los datos de nuestro servidor almacenados en objetos de tipo
personas que a su vez estn almacenados en un ArrayList, listos para ser mostrados por
pantalla, lo cual haremos con el mtodo mostrarPersona();
Bien, este mtodo no tiene mucha explicacin, leo los objetos almacenados en
nuestro ArrayList en la posicin que se le pasa por parmetro y lo muestro en
los Edittext.
Para ejecutarlo todo utilizaremos una clase AsyncTask
Y, como opcional, para movernos entre nuestro datos, podis agregar los
botones "siguiente" y "previo"
Lo nico que hacen estos ltimos es sumar 1 a posicin (mas) o restar 1(menos)
NOTA: Agregar permisos de Internet si no lo tenis agregado.
Archivos para descargar: WebServiceJSONExample
Si tenis dudas u os atascis en algo, preguntar.
Un saludo
La clase AsyncTask se debe crear como una clase interna de la clase donde
deseamos crear nuestro hilo.
Con esto, ya sabemos hacer que nuestra clase AsyncTask se ejecute en 2 plano, ahora
vamos a ver las fases por las que pasa nuestro AsyncTask una vez empieza a
ejecutarse:
La clase AsyncTask tiene varios mtodos que podemos sobreescribir en los que
podemos definir:
Bien, estos mtodos no se invocan fuera del AsyncTask, son internos, nosotros para
ejecutarlos solo debemos invocarexecute() y la propia clase los va ejecutando.
Bueno, una cosa que an no he comentado es el uso de genricos en esta clase (Si no
estas seguro de lo que son los genricos te recomiendo dos cosas: 1 visitar este enlace y
lo 2 es que estudies ms el temario bsico de java).
Bien, esta clase se caracteriza por hacer repeticiones del hilo continuamente cada X
segundos, es decir, funciona como un temporizador pudiendole indicar cuando queremos
que inicie y cada cuanto tiempo queremos que se repita, estas repeticiones van a ser
infinitas, es decir, una vez ejecutemos el hilo no parar de ejecutarse hasta que nosotros
se lo indiquemos
Anteriormente, en java, para hacer esto con los threads, creabamos un bucle
infinito (while, for...) y por medio del mtodosleep() le indicabamos cada cuanto tiempo
haciamos una repeticin, bien, TimerTask funciona ms o menos de la misma forma pero
por si sola, no hace falta poner sleep() ni nada parecido.
Bien, sabiendo esto, una clase TimerTask se construye de la misma forma que
una AsyncTask, es decir, como una clase interna:
Una vez creada nuestra clase interna TimerTask, vamos a hacer que funcione, para ello
vamos a utilizar la clase Timer.