Subido por adanmgs

Crear Un Web Service Para Android Con Mysql, Php y Json

Anuncio
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json

 Contacto
 BLOG 
 LIBRERÍA ANDROID
 COMIENZA AQUÍ
 BLOG 
 LIBRERÍA ANDROID
 COMIENZA AQUÍ

Crear Un Web Service
Para Android Con Mysql,
Php y Json
 James Revelo
 Mayo 26, 2015
¿Deseas conectar una aplicación Android a Mysql
Mysql?

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
1/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Obtén
Contenido
Exclusivo
¿Has intentado crear un web service con Php para la
comunicación de datos de tu aplicativo web con tu aplicativo
móvil android, pero aún no comprendes bien cómo hacerlo?
Aprende a
programar apps
Android con tips y
Pues bien, en este artículo te mostraré algunas ideas sobre la
creación de una aplicación android que consuma los datos de un
servidor externo a través de Php, Mysql y Json.
recursos que solo
comparto con
los suscriptores de
mi boletín privado
Para ello he creado una aplicación llamada “I Wish”, la cual
permite a nuestros usuarios guardar una lista de deseos y metas
que tienen en su vida. Con este ejemplo podrás ver cómo
implementar la inserción, edición, eliminación y consulta de
datos a través de un Web Service.
Correo
Si sigues leyendo podrás obtener el siguiente resultado:
SUSCRIBIRSE
¿Qué buscas?
Buscar
Lo Más Popular 
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
2/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Crear Un Web
Service Para
Android Con
Conectar Aplicación Android Con Php, Mysql …
Mysql, Php y Json
¿Cómo
Sincronizar
Sqlite Con
Mysql En
Android?
Aplicación
Android Con
Navigation
Drawer Y Tabs
El código de la aplicación puedes obtenerlo presionando el
siguiente botón:
NavigationView:
Navigation Drawer Con
Este Código Es Solo Para Suscriptores
Material Design
TabLayout:
¿Cómo Añadir
Pestañas En
Por favor suscríbete para desbloquear el código. Solo ingresa tu
email abajo.
Android?
Please enter your email address.
Suscribirme
Realizar
Peticiones
Http Con La
Librería Volley En Android
¡Tu correo estará 100% seguro y libre de spam!
Tutorial De
Bases De
Datos SQLite
En
1. ¿Qué Es Un Web Service?
Un Web Service o Servicio Web es un aplicativo que facilita
la interoperabilidad entre varios sistemas independientemente
del lenguaje de programación o plataforma en que fueron
Aplicaciones Android
Servicio Web
RESTful Para
Android Con
Php, Mysql y Json
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

3/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
desarrollados. Este debe tener una interfaz basada en un
formato estándar entendible por las maquinas como lo es XML o
Tutorial De
Listas Y
JSON.
Adaptadores
En Android
Por ejemplo…
Facebook es un aplicativo web construido con una determinada
arquitectura y lenguajes de programación basados en el
protocolo HTTP. Sin embargo podemos usar esta red social en
nuestro dispositivo Android.
Toolbar En
Android:
Creación De
Action Bar En Material
Design
¿Cómo es posible esto, si la aplicación Android está construida
con lenguaje Java?
A través de un Web Service construido para gestionar todas
aquellas operaciones sobre una base de datos alojada en los
servidores de Facebook. Quiere decir que ambos aplicativos
usan como puente la web para acceder a un solo repositorio de
datos.
Como ves, un Web Service se crea con funcionalidades que
permitan obtener datos actualizados en tiempo real. El hecho de
que sea dinámico incorpora el uso de un lenguaje web para la
gestión HTTP que en este caso será Php.
2. Requerimientos
Aplicación
De
La
Como leíste al inicio, la aplicación I Wish gestiona las metas y
sueños de los usuarios permitiéndoles tener un registro
completo. Básicamente el alcance del proyecto se resumen en:

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
4/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Como usuario de I Wish, deseo mantener los datos de todas
mis metas y sueños (se re ere al CRUD).
Como usuario de I Wish, deseo ver el detalle de cada meta.
Como usuario de I Wish, deseo que cada ítem tenga un
título, una descripción, una fecha límite de cumplimiento,
prioridad y categoría. Las categorías posibles son: Salud,
Finanzas, Profesional y Espiritual.
Estos requerimientos no son nada del otro mundo. Básicamente
estas ante una situación de listas y detalles. Algo que ya has
visto en artículos pasados con gran frecuencia.
El meollo del asunto se encuentra en el Web Service que debes
crear con Php y Mysql para el mantenimiento de los datos. Esta
vez no usaremos caching para el soporte de los datos locales
como lo hicimos al crear el lector Rss. Nos enfocaremos en
como usar Volley para realizar las peticiones en el localhost.
3.
Wireframing
Aplicación
De
La
A primera vista I Wish es una aplicación que se basa en la
funcionalidad básica de un crud. Tendremos una lista de los
elementos que existen, podremos ver el detalle de cada uno,
modi car su contenido e incluso borrarlos.
Teniendo en cuenta este razonamiento, puedes imaginar la
aplicación en primera instancia de la siguiente forma:

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
5/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Basado en el boceto que acabas de crear ya puedes identi car
que la cantidad de actividades, fragmentos, diálogos y
formularios que necesitas. Así que veamos la siguiente lista de
materiales a crear:
Actividad principal con un fragmento de lista.
Layout personalizado para ítems.
Actividad con fragmento de detalle.
Actividad con fragmento de formulario para inserción.
Actividad con fragmento de formulario para edición.
En este tutorial usaremos actividades basadas en fragmentos,
ya que muchos lectores han preguntado cómo hacer para
comunicar fragmentos con actividades y viceversa.
4. Crear UI Para La Aplicación
Android
4.1 Diseñar Actividad Principal Con
Fragmento Tipo Lista

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
6/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Después de haber creado tú proyecto en Android Studio vas a
crear una actividad principal que contengan un fragmento con
una lista. Debido a que vamos a añadir los fragmentos
programáticamente no es necesario enfocarnos tanto en los
layouts de las actividades. Incluso puedes usar un solo layout
para todas las actividades.
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/r
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" />
El fragmento pudiese heredar de ListFragment pero debido a
que vamos a usar un RecyclerView , el diseño es diferente. La
idea es añadir el recycler para recubrir toda la actividad y
además añadir un Floating Action Button en la parte inferior
derecha con el n de que el usuario añada nuevas metas.
Para añadir el FAB (Floating Action Button) podemos hacer uso
de una de las siguientes librerías que existen en la web:
Floating Action Button Library For Android
FloatingActionButton de makovkastar
Future Simple
Incluso podrías basarte en el ejemplo del sitio de android
devepers llamado FloatingActionButtonBasic. Todo depende de
ti. Cada librería trae la explicación de su implementación, así que
no hay excusas.
Por mi parte, en este ejemplo usaré la librería de makovkastar, ya
que necesitamos fabs muy simples. Para ello incluimos la
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

7/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
siguiente dependencia de Gradle:

compile 'com.melnykov:floatingactionbutton:1.3.0'
Veamos cómo queda el layout del fragmento principal:
fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:id="@+id/fragment_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/reciclador"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="3dp"
android:scrollbars="vertical" />
<com.melnykov.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_gravity="bottom|right"
android:layout_margin="16dp"
android:src="@mipmap/ic_add"
fab:fab_colorNormal="@color/accent"
fab:fab_colorPressed="@color/primary"
fab:fab_colorRipple="@color/ripple" />
</RelativeLayout>
Se
usa
una
etiqueta
<com.melnykov.fab.FloatingActionButton>
para
implementar el FAB. Simplemente se ubica en la parte inferior
derecha y le añadimos los colores correspondientes a su
interacción.
Donde colorNormal es el color que tiene en estado natural;
colorPressed
es
aquel
que
se
proyecta
cuando
lo
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

8/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
presionamos rapidamente y colorRipple se evidencia cuando
mantienes un click largo sobre él.
Otro aspecto a tener en cuenta es que los mipmaps o drawables
que uses para el icono de un FAB debe tener dimensiones de
24dp, para una buena experiencia de usuario:
El patrón anterior muestra un FAB grande para representar la
inserción con unas dimensiones reglamentarias de 56dpx56dp.
El icono que lleva debe mantenerse en 24dpx24dp.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
9/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
También podemos tener un FAB mini con dimensiones de
40dpx40dp, donde el icono se mantiene sobre 24dpx24dp.
4.2 Diseñar Actividad De Detalle Con
Fragmento Personalizado
Acudiendo a los estilos de layouts en Material Design,
dividiremos el fragmento de detalle en dos pasos. El primero
será una ImageView alusivo a la categoría de la meta y el
segundo será una hoja para sus datos completos.
Adicionalmente añadiremos un Float Button Action para la
edición de la meta.
fragment_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/r
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- Parte superior -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

10/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
android:layout_weight="50">
<ImageView
android:id="@+id/cabecera"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="30"
android:layout_marginBottom="28dp" />
<com.melnykov.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_gravity="bottom|right"
android:src="@mipmap/ic_edit"
fab:fab_colorNormal="@color/colorNormalMini"
fab:fab_colorPressed="@color/colorPressedMini"
fab:fab_colorRipple="@color/colorRippleMini"
android:layout_marginLeft="16dp"
fab:fab_type="mini"
android:layout_marginBottom="8dp"/>
<TextView
android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Titulo"
android:textAppearance="?android:attr/textAppeara
android:layout_marginBottom="48dp"
android:layout_toRightOf="@+id/fab"
android:layout_alignParentBottom="true"
android:layout_marginLeft="16dp"
android:textColor="@android:color/white" />
</RelativeLayout>
<!-- Datos de la meta -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="70"
android:paddingBottom="@dimen/activity_vertical_margi
android:paddingLeft="@dimen/activity_horizontal_margi
android:paddingRight="@dimen/activity_horizontal_marg
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/categoria"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/categoria_label"
android:text="Categoría"
android:textAppearance="?android:attr/textAppeara
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/fecha"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/fecha_label"
android:text="Fecha"
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

11/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
android:textAppearance="?android:attr/textAppeara
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/prioridad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/prioridad_label"
android:text="Prioridad"
android:textAppearance="?android:attr/textAppeara
<TextView
android:id="@+id/descripcion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/descripcion_label"
android:text="Descripción"
android:textAppearance="?android:attr/textAppeara
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/descripcion_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Descripción"
android:textAppearance="?android:attr/textAppeara
android:textColor="@android:color/black" />
<TextView
android:id="@+id/fecha_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/descripcion"
android:text="Fecha Límite"
android:textAppearance="?android:attr/textAppeara
android:textColor="@android:color/black" />
<TextView
android:id="@+id/categoria_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/fecha"
android:text="Categoría"
android:textAppearance="?android:attr/textAppeara
android:textColor="@android:color/black" />
<TextView
android:id="@+id/prioridad_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/categoria"
android:text="Prioridad"
android:textAppearance="?android:attr/textAppeara
android:textColor="@android:color/black" />
</RelativeLayout>
</LinearLayout>
El FAB debe usar el atributo fab:fab_type=”mini” para usar el
botón mini.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

12/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
En este caso se usó como nodo un LinearLayout con dos
RelativeLayout dentro. Esto nos permite dividir por pesos
(weight) la ocupación de espacio entre ambos layouts y así
mantener una proporción.
4.3
Diseñar
Formulario
Actividad
Con
La inserción y edición requiere de la proyección de un formulario
que contenga los controles necesarios para que el usuario
especi que la información personalizada que desea almacenar
en la base de datos. Para ello debes crear un layout con los
datos que viste en los requerimientos de la aplicación con las
respectivos views para obtener la información.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

13/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Por ejemplo…
El titulo de cada meta recibe texto escrito desde el input del
dispositivo, por lo que sabemos que el EditText es la solución
para este caso. La descripción es igual, necesita un campo de
texto. La fecha límite puede ser obtenida a través de un
DatePicker y para la categoría que tiene un dominio de varias
opciones, puedes usar un Spinner .
Veamos:

<RelativeLayout xmlns:android="http://schemas.android.com/apk
xmlns:tools="http://schemas.android.com/tools" android:la
android:layout_height="match_parent" android:paddingLeft=
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

14/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.herprogramacion.iwish.ui.fragmentos.Up
<!-- Titulo-->
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/titulo_input"
android:layout_alignParentTop="false"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:hint="Título"
android:minLines="1"
android:maxLines="1"
android:maxLength="55"
android:phoneNumber="false"
android:singleLine="true"
android:paddingTop="16dp"
android:paddingBottom="16dp" />
<!-- Descripción -->
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/descripcion_input"
android:layout_below="@+id/titulo_input"
android:layout_centerHorizontal="true"
android:hint="Descripción"
android:maxLength="128"
android:nestedScrollingEnabled="true"
android:paddingTop="16dp"
android:paddingBottom="16dp" />
<!-- Etiqueta Fecha -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceS
android:text="Fecha"
android:id="@+id/fecha_text"
android:layout_below="@+id/descripcion_input"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:paddingTop="16dp"
android:textColor="@android:color/black" />
<!-- Fecha -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceS
android:text="2015/05/17"
android:id="@+id/fecha_ejemplo_text"
android:layout_below="@+id/fecha_text" />
<!-- Categoría -->
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/categoria_spinner"
android:entries="@array/entradas_categoria"
android:layout_below="@+id/categoria_texto" />

<!-- Etiqueta Categoría -->
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
15/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceS
android:text="Categoría"
android:id="@+id/categoria_texto"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/fecha_ejemplo_text"
android:paddingTop="16dp"
android:textColor="@android:color/black" />
<!-- Etiqueta Prioridad -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceS
android:text="Prioridad"
android:id="@+id/prioridad_text"
android:layout_below="@+id/categoria_spinner"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="@android:color/black"
android:paddingTop="16dp" />
<!-- Prioridad -->
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/prioridad_spinner"
android:layout_below="@+id/prioridad_text"
android:entries="@array/entradas_prioridad" />
</RelativeLayout>
4.4 Diseñar Layout Personalizado
De Los Items
La organización de los atributos de cada meta dentro de los
ítems de la lista debe ser un resumen de sus características
principales. Puedes dejar la descripción solo para la actividad del
detalle y eliminarlo de la presentación en la lista.
item_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

16/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
<!-- Titulo -->
<TextView
android:id="@+id/titulo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Titulo"
android:textAppearance="?android:attr/textAppearanceM
android:layout_below="@+id/fecha"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="16dp" />
<!-- Categoría -->
<TextView
android:id="@+id/categoria"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Categoría"
android:textAppearance="?android:attr/textAppearanceM
android:textColor="@color/accent" />
<!-- Fecha -->
<TextView
android:id="@+id/fecha"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fecha"
android:textAppearance="?android:attr/textAppearanceM
android:layout_alignParentTop="true"
android:layout_alignParentLeft="false"
android:layout_alignParentStart="false"
android:textColor="@android:color/black"
android:layout_toRightOf="@+id/imageView" />
<!-- Prioridad -->
<TextView
android:id="@+id/prioridad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Prioridad"
android:textAppearance="?android:attr/textAppearanceS
android:layout_marginTop="8dp"
android:layout_below="@+id/titulo"
android:textStyle="italic" />
<!-- Icono para la fecha -->
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:src="@mipmap/ic_calendar"
android:layout_marginRight="3dp" />
</RelativeLayout>
El anterior diseño se vería de la siguiente forma:
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

17/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
5. Codi cación Del Web Service
En Php
Antes de crear la aplicación Android debes desarrollar primero tu
Web Service con cualquiera de los estándares que te interesen.
El alcance de este tutorial no abarca el uso de restricciones
REST, SOAP, RPC o sus parecidos. Simplemente verás cómo
crear las implementaciones Php necesarias para realizar
operaciones sobre una base de datos en Mysql a través de
peticiones GET y POST.
Si deseas aprender a crear Web Services con diseño REST,
entonces te recomiendo este excelente curso online con Laravel.
Para desarrollar este aplicativo usaré el entorno de desarrollo
XAMPP, el cual provee automáticamente una con guración
de un servidor Apache local, el intérprete de Php y el gestor
Mysql.
Sin embargo tu puedes usar las herramientas que desees para
gestionar pruebas locales. Lo importante es que puedas correr
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

18/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Mysql e interpretar scripts de Php.
5.1 Diseño E Implementación De La
Base De Datos
Diseñar base de datos: Si ya lo has notado, la base de datos de
la aplicación I Wish solo tiene una entidad que representa a los
registros de las metas. Esto reduce ampliamente el diseño de
bases de datos en el problema.
Los proyectos reales tienen modelos más complejos.
Nota: Si aún eres principiante en bases de datos, te
Nota
recomiendo descargar mi ebook metodología de diseño de
bases de datos. Créeme, te será de mucha utilidad.
Meta debe tener los atributos que hemos venido viendo más una
llave primaria que mantenga la integridad de los datos. Observa
el siguiente minidiagrama entidad-relación:
Crear base de datos: Para implementar la base de datos lo
primero que debes hacer es crear una nueva base de datos en la
aplicación phpMyAdmin que te otorga tu distribución XAMPP.
Donde le asignaremos el nombre de “i_wish”.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
19/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Ahora crea la tabla meta para que contenga seis columnas en su
estructura y además usa el formato UTF-8 para soportar
acentos. Puedes hacerlo a través del editor de phpMyAdmin o
con el siguiente comando CREATE :

CREATE TABLE IF NOT EXISTS meta(
idMeta int(3) PRIMARY KEY AUTO_INCREMENT,
titulo varchar(56) NOT NULL,
descripcion varchar(128) NOT NULL,
prioridad enum('Alta','Media','Baja','') NULL DEFAULT 'Alta
fechaLim date NOT NULL,
categoria enum('Salud','Finanzas','Espiritual','Profesional
)
Luego añade 5 registros de ejemplo en la tabla que permitan
probar el funcionamiento en la aplicación android más adelante.

INSERT INTO `i_wish`.`meta` (`idMeta`, `titulo`, `descripcion
VALUES (NULL,
'Comprar Mazda 6',
'Deseo adquirir un auto mazda 6 para mi desplazamiento en la
'Media',
'2015-11-20',
'Material'), (NULL,
'Obtener mi título de ingeniería de sistemas',
'Ya solo faltan 2 semestres para terminar mi carrera de ingen
'Alta',
'2016-06-17',
'Profesional'), (NULL,
'Conquistar a Natasha',
'Natasha es la mujer de vida. Tengo que decírselo antes de qu
'Alta',
'2015-05-25',
'Espiritual'), (NULL,
'Tener un peso de 70kg',
'Actualmente peso 92kg y estoy en sobrepeso. Sin embargo voy
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

20/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
'Baja',
'2016-05-13',
'Salud'), (NULL,
'Incrementar un 30% mis ingresos',
'Conseguiré una fuente de ingresos alternativa que represente
'Media',
'2015-10-13',
'Finanzas');
5.2 Crear Código
Consumir Datos
Php
Para
En primera instancia crea una conexión a la base de datos Mysql
con la interfaz que más se acomode a tus necesidades. En mi
caso voy a crear una conexión con PDO, la cual me permite
proteger los datos de inyecciones sql.
Luego de eso crea una clase que mapee la estructura de la tabla
meta . El objetivo de ello es proveerla de comportamientos de
inserción, actualización, eliminación y consulta a través de la
conexión a la base de datos.
Finalmente implementaré scripts Php para gestionar las
peticiones que lanzan los clientes. La idea es parsear los datos
en formato Json para que nuestra aplicación Android interprete
los resultados de forma legible.
Paso #1: Crear Conexión A La Base De
Datos Con PDO
El uso de PDO depende del enfoque que tengan tus proyectos,
puedes crear una clase que represente la conexión hacia la base
de datos o simplemente crear una nueva conexión en cada
script de Php que tengas.
Para este caso te compartiré un patrón singleton de PDO para
limitar el número de aperturas a la base de datos en una sola.
Con ello podremos disponer de un solo objeto a través de todo el
proyecto.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

21/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
No obstante hay patrones de diseño muy interesantes que
puedes consultar en la web. Por ejemplo el repositorio
del usuario indieteq en github. Él se enfoca en la implementación
del CRUD de una forma muy sencilla y orientada a objetos.
Veamos el resultado del patrón singleton:
Database.php
<?php
/**
* Clase que envuelve una instancia de la clase PDO
* para el manejo de la base de datos
*/

require_once 'mysql_login.php';
class Database
{
/**
* Única instancia de la clase
*/
private static $db = null;
/**
* Instancia de PDO
*/
private static $pdo;
final private function __construct()
{
try {
// Crear nueva conexión PDO
self::getDb();
} catch (PDOException $e) {
// Manejo de excepciones
}
}
/**
* Retorna en la única instancia de la clase
* @return Database|null
*/
public static function getInstance()
{
if (self::$db === null) {
self::$db = new self();
}
return self::$db;
}
/**
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

22/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
* Crear una nueva conexión PDO basada
* en los datos de conexión
* @return PDO Objeto PDO
*/
public function getDb()
{
if (self::$pdo == null) {
self::$pdo = new PDO(
'mysql:dbname=' . DATABASE .
';host=' . HOSTNAME .
';port:63343;',
USERNAME,
PASSWORD,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NA
);
// Habilitar excepciones
self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::
}
return self::$pdo;
}
/**
* Evita la clonación del objeto
*/
final protected function __clone()
{
}
function _destructor()
{
self::$pdo = null;
}
}
?>
Ten en cuenta que la conexión se abre con 4 cadenas
descriptivas del entorno que estás usando declaradas en el
archivo mysql_login.php. Con ello me re ero al nombre del host,
el nombre de la base de datos, el usuario con que deseas
ingresar y su respectiva contraseña.
Por el momento usaremos el localhost debido a las pruebas que
estamos haciendo. El usuario ya depende de ti, en mi caso uso el
usuario por defecto "root" y sin contraseña alguna.
mysql_login.php
<?php
/**

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

23/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
/**
* Provee las constantes para conectarse a la base de datos
* Mysql.
*/
define("HOSTNAME", "localhost");// Nombre del host
define("DATABASE", "i_wish"); // Nombre de la base de datos
define("USERNAME", "root"); // Nombre del usuario
define("PASSWORD", ""); // Nombre de la constraseña
?>
Adicionalmente
debes
añadir
al
cuarto
parámetro
del
constructor de PDO la indicación SET NAMES UTF-8 para el
servidor. Esto permite que los datos de la base de datos vengan
codi cados en este formato para evitar problemas de
compatibilidad.
Paso #4: Crear Clase Para Las Metas
En este paso vas a modelar en una clase a la tabla "meta" de
tal forma que aplique el CRUD sobre los datos a través de la
clase Database . En esencia necesitas un método para obtener
todos los registros, uno para la inserción, otro para eliminación,
también para la actualización y un método que permita obtener
del detalle de un solo registro.
Meta.php
<?php

/**
* Representa el la estructura de las metas
* almacenadas en la base de datos
*/
require 'Database.php';
class Meta
{
function __construct()
{
}
/**
* Retorna en la fila especificada de la tabla 'meta'
*
* @param $idMeta Identificador del registro
* @return array Datos del registro
*/
public static function getAll()
{
$consulta = "SELECT * FROM meta";
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

24/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
try {
// Preparar sentencia
$comando = Database::getInstance()->getDb()->prep
// Ejecutar sentencia preparada
$comando->execute();
return $comando->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
return false;
}
}
/**
* Obtiene los campos de una meta con un identificador
* determinado
*
* @param $idMeta Identificador de la meta
* @return mixed
*/
public static function getById($idMeta)
{
// Consulta de la meta
$consulta = "SELECT idMeta,
titulo,
descripcion,
prioridad,
fechaLim,
categoria
FROM meta
WHERE idMeta = ?";
try {
// Preparar sentencia
$comando = Database::getInstance()->getDb()->prep
// Ejecutar sentencia preparada
$comando->execute(array($idMeta));
// Capturar primera fila del resultado
$row = $comando->fetch(PDO::FETCH_ASSOC);
return $row;
} catch (PDOException $e) {
// Aquí puedes clasificar el error dependiendo de
// para presentarlo en la respuesta Json
return -1;
}
}
/**
* Actualiza un registro de la bases de datos basado
* en los nuevos valores relacionados con un identificado
*
* @param $idMeta
identificador
* @param $titulo
nuevo titulo
* @param $descripcion nueva descripcion
* @param $fechaLim
nueva fecha limite de cumplimiento
* @param $categoria
nueva categoria
* @param $prioridad
nueva prioridad
*/
public static function update(
$idMeta,
$titulo,
$descripcion,
$fechaLim,
$categoria,
$prioridad
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

25/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
)
{
// Creando consulta UPDATE
$consulta = "UPDATE meta" .
" SET titulo=?, descripcion=?, fechaLim=?, catego
"WHERE idMeta=?";
// Preparar la sentencia
$cmd = Database::getInstance()->getDb()->prepare($con
// Relacionar y ejecutar la sentencia
$cmd->execute(array($titulo, $descripcion, $fechaLim,
return $cmd;
}
/**
* Insertar una nueva meta
*
* @param $titulo
titulo del nuevo registro
* @param $descripcion descripción del nuevo registro
* @param $fechaLim
fecha limite del nuevo registro
* @param $categoria
categoria del nuevo registro
* @param $prioridad
prioridad del nuevo registro
* @return PDOStatement
*/
public static function insert(
$titulo,
$descripcion,
$fechaLim,
$categoria,
$prioridad
)
{
// Sentencia INSERT
$comando = "INSERT INTO meta ( " .
"titulo," .
" descripcion," .
" fechaLim," .
" categoria," .
" prioridad)" .
" VALUES( ?,?,?,?,?)";
// Preparar la sentencia
$sentencia = Database::getInstance()->getDb()->prepar
return $sentencia->execute(
array(
$titulo,
$descripcion,
$fechaLim,
$categoria,
$prioridad
)
);
}
/**
* Eliminar el registro con el identificador especificado
*
* @param $idMeta identificador de la meta
* @return bool Respuesta de la eliminación
*/
public static function delete($idMeta)
{
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

26/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Sentencia DELETE
$comando = "DELETE FROM meta WHERE idMeta=?";
// Preparar la sentencia
$sentencia = Database::getInstance()->getDb()->prepar
return $sentencia->execute(array($idMeta));
}
}
?>
Recuerda que el método prepare() permite reemplazar los
placeholders ( '?' ) a través de execute() . Esto protege la
operación de inyecciones que puedan atentar contra la
seguridad de los datos.
Paso #5: Crear Un Script Para Obtener
Todas Las Metas
Para retornar todos los registros que existen en la tabla "meta"
usaremos el método getAll() de la clase Meta . La trata de la
petición seguiría la siguiente lógica:
1. Comprobar que la petición se realizó con el método GET.
2. Obtener todos los registros.
3. ¿La obtención tuvo éxito?
1. SI -> Retornar objeto Json con los datos
2. NO -> Retornar objeto Json con mensaje de error
Tenemos un
ujo que se asegura de satisfacer el debido
resultado y aquellos resultados adversos. La trata de errores
debe comprender todos aquellos posibles caminos que puedan
generarse como una petición fallida, la falla de autenticación, la
no existencia del recurso, la no disponibilidad del servidor, etc. En
resumen, contempla todas las fallas tanto del lado del servidor
(códigos 5xx) como las del cliente (códigos 4xx).
No obstante este ejemplo se basa en el comportamiento ideal
de nuestro servidor local. Donde solo reportaremos aquellas
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

27/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
anomalías que sucedan en la base de datos, asumiendo que la
respuesta siempre tendrá un código de estado 200. Esto
permitirá trackear si nuestro web service está operando bien la
base de datos.
Además de ello PDO puede retornar en excepciones por distintas
causas que puedes estandarizar para el envío de mensajes. Pero
este trabajo te queda a tí :D
Ahora… ¿Cómo envío una respuesta de vuelta a la aplicación
Android?
Es justo donde entra Json para actuar como formato de
comunicación. En cada respuesta enviaremos una seria de
elementos Json que puedan ser interpretados del lado del
cliente.
Esto
te
será
posible
usando
las
funciones
json_encode() y json_decode() . La primera parsea un tipo
de dato a un string en formato json y la segunda es el
procedimiento contrario.
Veamos nuestro servicio de obtención:
obtener_metas.php
<?php
/**
* Obtiene todas las metas de la base de datos
*/

require 'Meta.php';
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
// Manejar petición GET
$metas = Meta::getAll();
if ($metas) {
$datos["estado"] = 1;
$datos["metas"] = $metas;
print json_encode($datos);
} else {
print json_encode(array(
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

28/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
"estado" => 2,
"mensaje" => "Ha ocurrido un error"
));
}
}
El objeto Json que retornaremos tiene un atributo llamado
"estado" el cual representa un código para indicar la calidad
del resultado. Si es 1 , entonces añadiremos otro atributo
llamado "metas" el cual es un array de objetos con los datos
de las metas. Si es
2 , entonces usaremos un atributo
"mensaje" para avisar a la aplicación cliente que ocurrió un
error en la operación a la base de datos.
Una respuesta de éxito tendría el siguiente aspecto:

{
"estado":1,
"metas":[
{
"idMeta":"2",
"titulo":"Obtener mi t\u00edtulo de ingenier\u00eda
"descripcion":"Ya solo faltan 2 semestres para termi
"prioridad":"Media",
"fechaLim":"2015-05-29",
"categoria":"Profesional"
},
{
"idMeta":"3",
"titulo":"Conquistar a Natasha",
"descripcion":"Natasha es la mujer de vida. Tengo qu
"prioridad":"Alta",
"fechaLim":"2015-05-25",
"categoria":"Espiritual"
}
]
}
Por el otro lado, la respuesta de error simplemente sería:

{
"estado":"2",
"mensaje":"Ha ocurrido un error"
}

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
29/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Cambiando de tema… ¿Qué pasa si quieres ltrar los registros?
Por ejemplo…
Puede que requieras en orden ascendente o descendente de los
registros con respecto a un campo. O simplemente obtener las
metas que van de una fecha a otra.
Para tener en cuenta estos casos, puedes consultar los datos de
acuerdo a una serie de parámetros establecidos en la API. Esto
quiere decir que podrías incluir en el cuerpo de la petición
variables que actúen como ltros en la selección. Sin embargo
dicho tema está fuera del alcance de nuestro artículo.
El diseño RESTful para Web Services provee reglas
supremamente estilizadas para ltrar y consultar datos de forma
más sencilla que estableciendo ltros manuales.
Paso #6: Crear Un Script Php Para
Consultar El Detalle De Una Meta
El segundo caso requiere que la petición traiga consigo el
identi cador de la meta que se desea ver en detalle. Con este
dato es posible usar el método getById() de Meta para
conseguir el array necesario.
Veamos:
<?php
/**
* Obtiene el detalle de una meta especificada por
* su identificador "idMeta"
*/

require 'Meta.php';
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
if (isset($_GET['idMeta'])) {
// Obtener parámetro idMeta
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

30/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Obtener parámetro idMeta
$parametro = $_GET['idMeta'];
// Tratar retorno
$retorno = Meta::getById($parametro);
if ($retorno) {
$meta["estado"] = "1";
$meta["meta"] = $retorno;
// Enviar objeto json de la meta
print json_encode($meta);
} else {
// Enviar respuesta de error general
print json_encode(
array(
'estado' => '2',
'mensaje' => 'No se obtuvo el registro'
)
);
}
} else {
// Enviar respuesta de error
print json_encode(
array(
'estado' => '3',
'mensaje' => 'Se necesita un identificador'
)
);
}
}
Para retornar el detalle obviamente primero debes comprobar
que el parámetro vino con la petición GET y si vino bien de nido.
Recuerda que la función isset() es quién realiza este trabajo.
Esta vez tenemos tres casos generales posibles. Que la consulta
sea un éxito y el registro con el identi cador enviado existe. Lo
que retorna en un objeto Json con un objeto interno que tiene los
datos de la meta.
{

"estado":"1",
"meta":{
"idMeta":"2",
"titulo":"Obtener mi t\u00edtulo de ingenier\u00eda de
"descripcion":"Ya solo faltan 2 semestres para terminar
"prioridad":"Media",
"fechaLim":"2015-05-29",
"categoria":"Profesional"
}
}
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

31/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
O también puede que PDO haya arrojado una excepción por
algún motivo. Por ejemplo un error de sintaxis, la inexistencia del
registro, etc. Con ello envías tu objeto representativo del estado
2.

{
"estado":"2",
"mensaje":"No se obtuvo el registro"
}
Ahora bien, puede que por alguna razón el parámetro no haya
venido en la petición, o que pueda que haya venido pero con otro
nombre. Para este caso envías tu código 3 indicando este
mensaje.

{
"estado":"3",
"mensaje":"Se necesita un identificador"
}
Paso #7: Crear Un Script Php Para La
Inserción De Metas
La inserción requiere el uso del método POST para la recepción
de los datos de la meta. Por lo que debemos leer los datos en
formato Json:
<?php
/**
* Insertar una nueva meta en la base de datos
*/

require 'Meta.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Decodificando formato Json
$body = json_decode(file_get_contents("php://input"), tru
// Insertar meta
$retorno = Meta::insert(
$body['titulo'],
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

32/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
$body['descripcion'],
$body['fechaLim'],
$body['categoria'],
$body['prioridad']);
if ($retorno) {
// Código de éxito
print json_encode(
array(
'estado' => '1',
'mensaje' => 'Creación exitosa')
);
} else {
// Código de falla
print json_encode(
array(
'estado' => '2',
'mensaje' => 'Creación fallida')
);
}
}
La primera instrucción es comprobar la petición POST obtenida.
Luego de ello conviertes el cuerpo de la petición a un arreglo de
strings.
Esto
es
posible
consultando
el
ujo
con
file_get_contents() , que convierte un archivo a string.
Obviamente es necesario que uses la convención “php://input”
para acceder al cuerpo de la petición POST.
Ahora, el resultado que obtengas con file_get_contents()
debe estar en formato Json, por lo que convertiremos esos
datos a un arreglo asociativo que nos permita acceder a la
información. Para ello usa la función json_decode() y pasa
como segundo parámetro el valor de true .
Luego usa el método insert() de Meta y comprueba el
resultado. Esta vez no retornas en las de la base de datos, así
que el estado 1 contiene un mensaje de éxito.

{
"estado":"1",
"mensaje":"Creación éxitosa"
}
De lo contrario usa un mensaje general de error.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

33/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json

{
"estado":"2",
"mensaje":"Creación fallida"
}
Paso #8: Crear Un Scritp Php Para La
Actualización De Metas
La actualización es casi idéntica a la inserción, solo que esa vez
debemos obtener el identi cador de la meta para saber que
registro actualizar. De resto procedemos con el método
update() de Meta sin problemas:
<?php
/**
* Actualiza una meta especificada por su identificador
*/

require 'Meta.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Decodificando formato Json
$body = json_decode(file_get_contents("php://input"), tru
// Actualizar meta
$retorno = Meta::update(
$body['idMeta'],
$body['titulo'],
$body['descripcion'],
$body['fechaLim'],
$body['categoria'],
$body['prioridad']);
if ($retorno) {
// Código de éxito
print json_encode(
array(
'estado' => '1',
'mensaje' => 'Actualización exitosa')
);
} else {
// Código de falla
print json_encode(
array(
'estado' => '2',
'mensaje' => 'Actualización fallida')
);
}
}

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
34/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Es resultado de éxito es similar y repetitivo para la actualización:

{
"estado":"1",
"mensaje":"Actualización éxitosa"
}
Al igual que el objeto Json de error:

{
"estado":"2",
"mensaje":"Actualización fallida"
}
Paso #9: Crear Un Script Php Para La
Eliminación De Metas
La eliminación se basa en el método POST para enviar el
identi cador de la meta que se necesita eliminar de la base de
datos. Esta vez usaremos el método delete() de Meta .
<?php
/**
* Elimina una meta de la base de datos
* distinguida por su identificador
*/

require 'Meta.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Decodificando formato Json
$body = json_decode(file_get_contents("php://input"), tru
$retorno = Meta::delete($body['idMeta']);
if ($retorno) {
print json_encode(
array(
'estado' => '1',
'mensaje' => 'Eliminación exitosa')
);
} else {
print json_encode(
array(
'estado' => '2',
'mensaje' => 'Eliminación fallida')
);
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

35/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
}
}
Como ves este servicio no es nada complicado. Su respuesta de
éxito ser vería de la siguiente forma:

{
"estado":"1",
"mensaje":"Eliminación éxitosa"
}
Y los errores se mostrarían así:

{
"estado":"2",
"mensaje":"Eliminación fallida"
}
6.
Codi cación
Aplicación Android
De
La
Una vez creado el Web Service, es hora de construir nuestra
aplicación gestora de metas. Recuerda que es necesario que
crees
los
siguientes
elementos
e
interacciones
de
la
arquitectura:
Un patrón singleton Volley para las peticiones (o un cliente
HttpURLConnection si lo deseas).
Crear la petición personalizada para tratar respuestas Json
(el código ya fue tratado en el artículo de Volley).
Crear un adaptador que procese los elementos del recycler
view.
Tratar los eventos para la comunicación de datos a través
de los controles.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

36/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
La idea es enfocarnos en el uso del servicio web y aprovechar al
máximo las peticiones Json que nos provee Volley.
Paso #1: Crear Patrón Singleton
Volley
Este paso ya hace parte de nuestra rutina para gestionar
peticiones HTTP. Así que reutilizarás el singleton de artículos
pasados para simpli car procesos. La única diferencia que
tendrás será la ausencia del ImageLoader como atributo. En
esta ocasión no usaremos caching de imágenes, así que es justo
dejarlo descansar.
Recuerda incluir la librería Volley en tu proyecto de la forma que
más te parezca.
VolleySingleton.java
import android.content.Context;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
/**
* Creado por Hermosa Programación.
*
* Clase que representa un cliente HTTP Volley
*/
public final class VolleySingleton {
// Atributos
private static VolleySingleton singleton;
private RequestQueue requestQueue;
private static Context context;
private VolleySingleton(Context context) {
VolleySingleton.context = context;
requestQueue = getRequestQueue();
}
/**
* Retorna la instancia unica del singleton
* @param context contexto donde se ejecutarán las petici
* @return Instancia
*/
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

37/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
public static synchronized VolleySingleton getInstance(Co
if (singleton == null) {
singleton = new VolleySingleton(context.getApplic
}
return singleton;
}
/**
* Obtiene la instancia de la cola de peticiones
* @return cola de peticiones
*/
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(context.get
}
return requestQueue;
}
/**
* Añade la petición a la cola
* @param req petición
* @param <T> Resultado final de tipo T
*/
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
}
Para acceder a las URLs del web service con aislamiento, crea
una clase para referenciar constantes de la aplicación. Allí
añadirás
todas
las
direcciones
para
evitar
múltiples
declaraciones:

/**
* Clase que contiene los códigos usados en "I Wish" para
* mantener la integridad en las interacciones entre activida
* y fragmentos
*/
public class Constantes {
/**
* Transición Home -> Detalle
*/
public static final int CODIGO_DETALLE = 100;
/**
* Transición Detalle -> Actualización
*/
public static final int CODIGO_ACTUALIZACION = 101;
/**
* Puerto que utilizas para la conexión.
* Dejalo en blanco si no has configurado esta carácteris
*/
private static final String PUERTO_HOST = "63343";
/**
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

38/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
* Dirección IP de genymotion o AVD
*/
private static final String IP = "http://10.0.3.2:";
/**
* URLs del Web Service
*/
public static final String GET = IP + PUERTO_HOST + "/I%2
public static final String GET_BY_ID = IP + PUERTO_HOST +
public static final String UPDATE = IP + PUERTO_HOST + "/
public static final String DELETE = IP + PUERTO_HOST + "/
public static final String INSERT = IP + PUERTO_HOST + "/
/**
* Clave para el valor extra que representa al identifica
*/
public static final String EXTRA_ID = "IDEXTRA";
}
Como ves, yo uso para el localhost la dirección 10.0.3.2
debido a que Genymotion (emulador alternativo) estableció este
valor. Si vas a usar el emulador de android usa la dirección
10.0.2.2 . Aquí el sitio o cial te habla un poco más sobre estas
convenciones de direcciones para operaciones en la web.
Paso #2: Crear fuente de datos para
las metas
Nuestro adaptador necesita alimentarse de una lista de
elementos que le proporcionen la información necesaria para
proyectar el layout. Es por eso que tienes que crear una clase
que represente la existencia de una meta en la aplicación
Android.
Crea una nueva clase en Android Studio y llámala Meta . Pon
todos aquellos atributos puestos en la base de datos:
/**
* Reflejo de la tabla 'meta' en la base de datos
*/
public class Meta {

/*
Atributos
*/
private String idMeta;
private String titulo;
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

39/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
private
private
private
private
String
String
String
String
descripcion;
prioridad;
fechaLim;
categoria;
public Meta(String idMeta, String titulo, String descripc
this.idMeta = idMeta;
this.titulo = titulo;
this.descripcion = descripcion;
this.prioridad = prioridad;
this.fechaLim = fechaLim;
this.categoria = categoria;
}
public String getIdMeta() {
return idMeta;
}
public String getTitulo() {
return titulo;
}
public String getDescripcion() {
return descripcion;
}
public String getPrioridad() {
return prioridad;
}
public String getFechaLim() {
return fechaLim;
}
public String getCategoria() {
return categoria;
}
/**
* Compara los atributos de dos metas
* @param meta Meta externa
* @return true si son iguales, false si hay cambios
*/
public boolean compararCon(Meta meta) {
return this.titulo.compareTo(meta.titulo) == 0 &&
this.descripcion.compareTo(meta.descripcion)
this.fechaLim.compareTo(meta.fechaLim) == 0 &
this.categoria.compareTo(meta.categoria) == 0
this.prioridad.compareTo(meta.prioridad) == 0
}
}
Si te jas, tenemos un método para comparar una meta con otra
para determinar si son iguales o no. Este método será de gran
ayuda al momento de validar si hay cambios en los datos de los
formularios cuando el usuario interactúa con ellos. Lo que
permitirá determinar si hay que lanzar diálogos de con rmación
antes de aplicar acciones.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

40/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Paso
#3:
Crear
adaptador
personalizado para el Recycler View
En este paso debes relacionar el layout item_list.xml con los
datos que tenga cada objeto Meta de la fuente de datos.
No olvides usar el patrón ViewHolder para reducir la cantidad de
llamadas del método findViewById().
Además de ello tenemos que implementar sobre cada view
holder una escucha OnClickListener para recibir los eventos
del usuario en la lista. Para ello se creará una interfaz
intermediaria entre el ViewHolder y el adaptador, de tal forma
que cuando se active el evento onClick() este inicie la
actividad de detalle.
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.support.v7.widget.RecyclerView;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.TextView;

import com.herprogramacion.iwish.R;
import com.herprogramacion.iwish.modelo.Meta;
import com.herprogramacion.iwish.ui.actividades.DetailActivit
import java.util.List;
/**
* Adaptador del recycler view
*/
public class MetaAdapter extends RecyclerView.Adapter<MetaAda
implements ItemClickListener {
/**
* Lista de objetos {@link Meta} que representan la fuent
* de inflado
*/
private List<Meta> items;
/*
Contexto donde actua el recycler view
*/
private Context context;
public MetaAdapter(List<Meta> items, Context context) {
this.context = context;
this.items = items;
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

41/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public MetaViewHolder onCreateViewHolder(ViewGroup viewGr
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_list, viewGroup, false
return new MetaViewHolder(v, this);
}
@Override
public void onBindViewHolder(MetaViewHolder viewHolder, i
viewHolder.titulo.setText(items.get(i).getTitulo());
viewHolder.prioridad.setText(items.get(i).getPriorida
viewHolder.fechaLim.setText(items.get(i).getFechaLim(
viewHolder.categoria.setText(items.get(i).getCategori
}
/**
* Sobrescritura del método de la interfaz {@link ItemCli
*
* @param view
item actual
* @param position posición del item actual
*/
@Override
public void onItemClick(View view, int position) {
DetailActivity.launch(
(Activity) context, items.get(position).getId
}
public static class MetaViewHolder extends RecyclerView.V
implements View.OnClickListener {
// Campos respectivos de un item
public TextView titulo;
public TextView prioridad;
public TextView fechaLim;
public TextView categoria;
public ItemClickListener listener;
public MetaViewHolder(View v, ItemClickListener liste
super(v);
titulo = (TextView) v.findViewById(R.id.titulo);
prioridad = (TextView) v.findViewById(R.id.priori
fechaLim = (TextView) v.findViewById(R.id.fecha);
categoria = (TextView) v.findViewById(R.id.catego
this.listener = listener;
v.setOnClickListener(this);
}
@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
}
}
interface ItemClickListener {
void onItemClick(View view, int position);
}
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

42/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
ItemClickListener es la interfaz de comunicación que nos
ayudará a relacionar lo posición del view con el evento
Como ves se implementa en la clase
MetaAdapter para iniciar la actividad detalle a través de su
onClick()
.
método de fabricación launch() .
Es necesario que enviemos el identi cador de la meta para tener
una referencia de la meta que debemos detallar.
Esto signi ca que se debe realizar otra petición para obtener los
datos de la meta seleccionada. Lo que podría evitarse a través
de caching con SQLite o enviando todos los datos de la meta.
Sin embargo el
n de este tutorial es el uso al máximo de
nuestro Web Service para que puedas interiorizar el
conocimiento y practicar esta metodología. Por ahora no te
preocupes en la arquitectura u optimizaciones.
Paso #4: Realizar Petición Para
Poblar La Lista
Ya has construido un Web Service en Php con todas
las características necesarias y has desarrollado los
componentes de software para que la aplicación Android
comience a funcionar.
El fragmento de la lista lo iniciaremos dinámicamente a través
del método onCreate() de MainActivity :
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.herprogramacion.iwish.R;
import com.herprogramacion.iwish.ui.fragmentos.MainFragment;
/**
* Actividad principal que contiene un fragmento con una list
* Recuerda que la nueva librería de soporte reemplazó la cla
* {@link android.support.v7.app.ActionBarActivity} por
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

43/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
* {@link AppCompatActivity} para el uso de la action bar
* en versiones antiguas.
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Creación del fragmento principal
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment(),"
.commit();
}
}
}
La comunicación inicial con el servidor es la lectura de todas las
metas que se han guardado hasta el momento. Con ellas
poblaremos la lista a penas inicie la aplicación. Por lo que
debemos dirigirnos al fragmento principal y generar una petición
GET hacia el servidor en onCreateView() .
Veamos:

import
import
import
import
import
import
import
import
import
import
android.content.Intent;
android.os.Bundle;
android.support.v4.app.Fragment;
android.support.v7.widget.LinearLayoutManager;
android.support.v7.widget.RecyclerView;
android.util.Log;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.Toast;
import
import
import
import
import
import
import
import
import
import
import
com.android.volley.Request;
com.android.volley.Response;
com.android.volley.VolleyError;
com.android.volley.toolbox.JsonObjectRequest;
com.google.gson.Gson;
com.herprogramacion.iwish.R;
com.herprogramacion.iwish.modelo.Meta;
com.herprogramacion.iwish.tools.Constantes;
com.herprogramacion.iwish.ui.MetaAdapter;
com.herprogramacion.iwish.ui.actividades.InsertActivit
com.herprogramacion.iwish.web.VolleySingleton;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

44/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
import java.util.Arrays;
/**
* Fragmento principal que contiene la lista de las metas
*/
public class MainFragment extends Fragment {
/*
Etiqueta de depuracion
*/
private static final String TAG = MainFragment.class.getS
/*
Adaptador del recycler view
*/
private MetaAdapter adapter;
/*
Instancia global del recycler view
*/
private RecyclerView lista;
/*
instancia global del administrador
*/
private RecyclerView.LayoutManager lManager;
/*
Instancia global del FAB
*/
com.melnykov.fab.FloatingActionButton fab;
private Gson gson = new Gson();
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGro
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_main, con
lista = (RecyclerView) v.findViewById(R.id.reciclador
lista.setHasFixedSize(true);
// Usar un administrador para LinearLayout
lManager = new LinearLayoutManager(getActivity());
lista.setLayoutManager(lManager);
// Cargar datos en el adaptador
cargarAdaptador();
// Obtener instancia del FAB
fab = (com.melnykov.fab.FloatingActionButton) v.findV
// Asignar escucha al FAB
fab.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// Iniciar actividad de inserción
getActivity().startActivityForResult(
new Intent(getActivity(), Ins
}
}
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

45/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
);
return v;
}
/**
* Carga el adaptador con las metas obtenidas
* en la respuesta
*/
public void cargarAdaptador() {
// Petición GET
VolleySingleton.
getInstance(getActivity()).
addToRequestQueue(
new JsonObjectRequest(
Request.Method.GET,
Constantes.GET,
null,
new Response.Listener<JSONObj
@Override
public void onResponse(JS
// Procesar la respue
procesarRespuesta(res
}
},
new Response.ErrorListener()
@Override
public void onErrorRespon
Log.d(TAG, "Error Vol
}
}
)
);
}
/**
* Interpreta los resultados de la respuesta y así
* realizar las operaciones correspondientes
*
* @param response Objeto Json con la respuesta
*/
private void procesarRespuesta(JSONObject response) {
try {
// Obtener atributo "estado"
String estado = response.getString("estado");
switch (estado) {
case "1": // EXITO
// Obtener array "metas" Json
JSONArray mensaje = response.getJSONArray
// Parsear con Gson
Meta[] metas = gson.fromJson(mensaje.toSt
// Inicializar adaptador
adapter = new MetaAdapter(Arrays.asList(m
// Setear adaptador a la lista
lista.setAdapter(adapter);
break;
case "2": // FALLIDO
String mensaje2 = response.getString("men
Toast.makeText(
getActivity(),
mensaje2,
Toast.LENGTH_LONG).show();
break;
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

46/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
El código anterior muestra el uso de una constante llamada
Constantes.GET, la cual contiene la dirección del servicio de
obtención obtener_metas.php.
Con
esa
URL
ya es posible realizar la petición
JsonObjectRequest con su respectivo método GET a través
del método cargarAdaptador() .
Para aislar un poco los procesos, he creado el método
procesarRespuesta() , el cual recibe un objeto JSONObject
en bruto para comenzar el parsing. Donde he divido los caminos
a través de una estructura switch basado en el valor del
atributo "estado" .
Si el estado es exitoso inmediatamente obtendremos el array de
metas que viene en el atributo "metas" . Este arreglo de objetos
Json se parsea directamente a un arreglo de objetos Meta a
través de la librería Gson.
Recuerda que el adaptador recibe una serie de metas en formato
List<Meta> , por lo que usaremos la clase
Arrays para
convertir el arreglo de metas a lista. Con eso listo ya es posible
instanciar el adaptador y asignarlo al recycler.
Paso #5: Ver Detalle De Items En
Otra Actividad

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
47/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Una vez nuestro adaptador poblado, ya podemos ver el detalle
de la descripción en DetailActivity.java con un fragmento
alojado.
Para ello inicia el fragmento dinámicamente en onCreate():
DetailActivity.java
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.content.Intent;
android.os.Bundle;
android.support.v7.app.AppCompatActivity;
android.view.Menu;
android.view.MenuItem;

import com.herprogramacion.iwish.R;
import com.herprogramacion.iwish.tools.Constantes;
import com.herprogramacion.iwish.ui.fragmentos.DetailFragment
/**
* Esta actividad contiene un fragmento que muestra el detall
* de las metas.
*/
public class DetailActivity extends AppCompatActivity {
/**
* Instancia global de la meta a detallar
*/
private String idMeta;
/**
* Inicia una nueva instancia de la actividad
*
* @param activity Contexto desde donde se lanzará
* @param idMeta
Identificador de la meta a detallar
*/
public static void launch(Activity activity, String idMet
Intent intent = getLaunchIntent(activity, idMeta);
activity.startActivityForResult(intent, Constantes.CO
}
/**
* Construye un Intent a partir del contexto y la activid
* de detalle.
*
* @param context Contexto donde se inicia
* @param idMeta Identificador de la meta
* @return Intent listo para usar
*/
public static Intent getLaunchIntent(Context context, Str
Intent intent = new Intent(context, DetailActivity.cl
intent.putExtra(Constantes.EXTRA_ID, idMeta);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

48/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getSupportActionBar() != null) {
// Dehabilitar titulo de la actividad
getSupportActionBar().setDisplayShowTitleEnabled(
// Setear ícono "X" como Up button
getSupportActionBar().setHomeAsUpIndicator(R.mipm
}
// Retener instancia
if (getIntent().getStringExtra(Constantes.EXTRA_ID) !
idMeta = getIntent().getStringExtra(Constantes.EX
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, DetailFragment.creat
.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_detail, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
Este código tiene varias cosas interesantes. En primera instancia
el uso de un método estático llamado launch() , el cual
construye una instancia de la actividad de detalle y la inicia a
través de un Intent construido a partir del contexto que el
adaptador proveerá.
La actividad detalle se basa en el identi cador de la meta, por lo
que idMeta es un atributo que permitirá retener esa instancia,
cuando sea pedida con getIntent() .

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
49/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
A los fragmentos que hemos iniciado dinámicamente se les está
asignando una etiqueta que los diferencie de los otros. Esto es
de suprema importancia, ya que necesitamos obtener sus
instancias cuando la actividad se comunique con ellos.
Paso #9: Consultar Detalles De
Cada Item
Ahora pregúntate que debe hacer el fragmento de detalle…
Dependiendo del enfoque de experiencia de usuario que tengas,
puede que sean muchas cosas. Sin embargo para este ejemplo
el usuario tiene dos caminos evidentes:
Cerrar el detalle con el Up Button o Back Button
Editar la meta a través del Floating Action Button.
La
primera
interacción ya la tenemos cubierta
DetailActivity ,
ya
que
hemos
sobrescrito
en
el
comportamiento del Up Button por el cierre de la actividad.
En el segundo caso de edición es necesario consultar la base de
datos para setear los datos en los views. Además de ello asignar
una escucha al FAB para que inicie la actividad de actualización.
Realizar petición HTTP: La realización de la petición HTTP
requiere consultar el detalle con el identi cador que el adaptador
envío a través del Intent.
Recuerda que la convención createInstance() inicializa un
nuevo fragmento con los extras necesarios para su
funcionamiento. Por lo que en onCreateView() es posible
acceder al identi cador y enviar una petición GET hacia el Web
Service:

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
50/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
DetailFragment.java

import
import
import
import
import
import
import
import
import
import
import
android.content.Intent;
android.os.Bundle;
android.support.v4.app.Fragment;
android.util.Log;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.ImageButton;
android.widget.ImageView;
android.widget.TextView;
android.widget.Toast;
import
import
import
import
import
import
import
import
import
import
com.android.volley.Request;
com.android.volley.Response;
com.android.volley.VolleyError;
com.android.volley.toolbox.JsonObjectRequest;
com.google.gson.Gson;
com.herprogramacion.iwish.R;
com.herprogramacion.iwish.modelo.Meta;
com.herprogramacion.iwish.tools.Constantes;
com.herprogramacion.iwish.ui.actividades.UpdateActivit
com.herprogramacion.iwish.web.VolleySingleton;
import org.json.JSONException;
import org.json.JSONObject;
/**
* A placeholder fragment containing a simple view.
*/
public class DetailFragment extends Fragment {
/*
Etiqueta de valor extra
*/
private static final String EXTRA_ID = "IDMETA";
/**
* Etiqueta de depuración
*/
private static final String TAG = DetailFragment.class.ge
/*
Instancias de Views
*/
private ImageView cabecera;
private TextView titulo;
private TextView descripcion;
private TextView prioridad;
private TextView fechaLim;
private TextView categoria;
private ImageButton editButton;
private String extra;
private Gson gson = new Gson();
public DetailFragment() {
}
public static DetailFragment createInstance(String idMeta
DetailFragment detailFragment = new DetailFragment();
Bundle bundle = new Bundle();
bundle.putString(EXTRA_ID, idMeta);
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

51/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
detailFragment.setArguments(bundle);
return detailFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGro
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_detail, c
// Obtención de views
cabecera = (ImageView) v.findViewById(R.id.cabecera);
titulo = (TextView) v.findViewById(R.id.titulo);
descripcion = (TextView) v.findViewById(R.id.descripc
prioridad = (TextView) v.findViewById(R.id.prioridad)
fechaLim = (TextView) v.findViewById(R.id.fecha);
categoria = (TextView) v.findViewById(R.id.categoria)
editButton = (ImageButton) v.findViewById(R.id.fab);
// Setear escucha para el fab
editButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
// Iniciar actividad de actualización
Intent i = new Intent(getActivity(),
i.putExtra(EXTRA_ID, extra);
getActivity().startActivityForResult(
}
}
);
// Obtener extra del intent de envío
extra = getArguments().getString(EXTRA_ID);
// Cargar datos desde el web service
cargarDatos();
return v;
}
/**
* Obtiene los datos desde el servidor
*/
public void cargarDatos() {
// Añadir parámetro a la URL del web service
String newURL = Constantes.GET_BY_ID + "?idMeta=" + e
// Realizar petición GET_BY_ID
VolleySingleton.getInstance(getActivity()).addToReque
new JsonObjectRequest(
Request.Method.GET,
newURL,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject
// Procesar respuesta Json
procesarRespuesta(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(Volle
Log.d(TAG, "Error Volley: " +
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

52/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
}
}
)
);
}
/**
* Procesa cada uno de los estados posibles de la
* respuesta enviada desde el servidor
*
* @param response Objeto Json
*/
private void procesarRespuesta(JSONObject response) {
try {
// Obtener atributo "mensaje"
String mensaje = response.getString("estado");
switch (mensaje) {
case "1":
// Obtener objeto "meta"
JSONObject object = response.getJSONObjec
//Parsear objeto
Meta meta = gson.fromJson(object.toString
// Asignar color del fondo
switch (meta.getCategoria()) {
case "Salud":
cabecera.setBackgroundColor(getRe
break;
case "Finanzas":
cabecera.setBackgroundColor(getRe
break;
case "Espiritual":
cabecera.setBackgroundColor(getRe
break;
case "Profesional":
cabecera.setBackgroundColor(getRe
break;
case "Material":
cabecera.setBackgroundColor(getRe
break;
}
// Seteando valores en los views
titulo.setText(meta.getTitulo());
descripcion.setText(meta.getDescripcion()
prioridad.setText(meta.getPrioridad());
fechaLim.setText(meta.getFechaLim());
categoria.setText(meta.getCategoria());
break;
case "2":
String mensaje2 = response.getString("men
Toast.makeText(
getActivity(),
mensaje2,
Toast.LENGTH_LONG).show();
break;
case "3":
String mensaje3 = response.getString("men
Toast.makeText(
getActivity(),
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

53/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
mensaje3,
Toast.LENGTH_LONG).show();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Para la inclusión de parámetros en la petición GET, adjunta a la
URL el valor de idMeta con la convención de formularios '?
clave=valor' .
Al igual que en MainFragment , se creó un método para
procesar la respuesta dependiendo del estado que se obtuvo. Si
hubo éxito, entonces seteamos los valores correspondientes de
cada view.
Paso #10: Realizar petición POST
para editar detalles de la meta
Para la edición hemos creado la actividad UpdateActivity , la
cual mostrará el formulario de recolección con los datos de la
una meta.
La lógica funciona así: Una vez el usuario haya modi cado los
datos, entonces puede con rmar sus datos presionando el
action button de check que usaremos para la con rmación. Si no
está de acuerdo o se arrepiente de ello, entonces puede
descartar los cambios con el segundo action button. Incluso
puedes incluir la eliminación entre los action buttos.
Así que lo primero es crear un archivo de menú para poblar la
action bar:
menu_form.xml
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

54/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json

<menu xmlns:android="http://schemas.android.com/apk/res/andro
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.herprogramacion.iwish.ui.actividades.U
<!-- Descartar Cambios -->
<item android:id="@+id/action_discard" android:title="@st
android:orderInCategory="3" app:showAsAction="never"
<!-- Borrar -->
<item android:id="@+id/action_delete" android:title="@str
android:orderInCategory="4" app:showAsAction="never"/
</menu>
No incluiremos el guardado de
implementaremos en el Up Button.
cambios,
ya
que
lo
Teniendo en cuenta esa apreciación las tareas que tienes
por implementar son:
Cargar los datos de la meta en los componentes del
formulario.
Habilitar la contribución a la action bar.
Manejar los eventos en cada action button.
Implementar la inserción, eliminación y borrado de las
metas.
Lanzar diálogos para con rmar la eliminación y el descarte
de cambios.
Usar Toasts
para
a anzar
la
con rmación
de
las
operaciones.
Veamos la solución:
UpdateFragment.java
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.support.v4.app.DialogFragment;
android.support.v4.app.Fragment;
android.util.Log;
android.view.LayoutInflater;
android.view.MenuItem;

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

55/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
import
import
import
import
import
import
android.view.View;
android.view.ViewGroup;
android.widget.EditText;
android.widget.Spinner;
android.widget.TextView;
android.widget.Toast;
import
import
import
import
import
import
import
import
import
com.android.volley.Request;
com.android.volley.Response;
com.android.volley.VolleyError;
com.android.volley.toolbox.JsonObjectRequest;
com.google.gson.Gson;
com.herprogramacion.iwish.R;
com.herprogramacion.iwish.modelo.Meta;
com.herprogramacion.iwish.tools.Constantes;
com.herprogramacion.iwish.web.VolleySingleton;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* Fragmento con formulario para actualizar la meta
*/
public class UpdateFragment extends Fragment {
/*
Etiqueta de depuración
*/
private static final String TAG = UpdateFragment.class.ge
/*
Etiqueta de valor extra para modo edición
*/
private static final String EXTRA_ID = "IDMETA";
/*
Controles
*/
private EditText titulo_input;
private EditText descripcion_input;
private Spinner prioridad_spinner;
private TextView fecha_text;
private Spinner categoria_spinner;
/*
Valor del argumento extra
*/
private String idMeta;
/**
* Es la meta obtenida como respuesta de la petición HTTP
*/
private Meta metaOriginal;
/**
* Instancia Gson para el parsing Json
*/
private Gson gson = new Gson();
public UpdateFragment() {
}
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

56/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
/**
* Crea un nuevo fragmento basado en un argumento
*
* @param extra Argumento de entrada
* @return Nuevo fragmento
*/
public static Fragment createInstance(String extra) {
UpdateFragment detailFragment = new UpdateFragment();
Bundle bundle = new Bundle();
bundle.putString(EXTRA_ID, extra);
detailFragment.setArguments(bundle);
return detailFragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGro
Bundle savedInstanceState) {
// Inflando layout del fragmento
View v = inflater.inflate(R.layout.fragment_form, con
// Obtención de instancias controles
titulo_input = (EditText) v.findViewById(R.id.titulo_
descripcion_input = (EditText) v.findViewById(R.id.de
fecha_text = (TextView) v.findViewById(R.id.fecha_eje
categoria_spinner = (Spinner) v.findViewById(R.id.cat
prioridad_spinner = (Spinner) v.findViewById(R.id.pri
fecha_text.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePicke
picker.show(getFragmentManager(), "da
}
}
);
// Obtener valor extra
idMeta = getArguments().getString(EXTRA_ID);
if (idMeta != null) {
cargarDatos();
}
return v;
}
/**
* Obtiene los datos desde el servidor
*/
private void cargarDatos() {
// Añadiendo idMeta como parámetro a la URL
String newURL = Constantes.GET_BY_ID + "?idMeta=" + i
// Consultar el detalle de la meta
VolleySingleton.getInstance(getActivity()).addToReque
new JsonObjectRequest(
Request.Method.GET,
newURL,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

57/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Procesa la respuesta GET_B
procesarRespuestaGet(response
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(Volle
Log.d(TAG, "Error Volley: " +
}
}
)
);
}
/**
* Procesa la respuesta de obtención obtenida desde el se
*/
private void procesarRespuestaGet(JSONObject response) {
try {
String estado = response.getString("estado");
switch (estado) {
case "1":
JSONObject meta = response.getJSONObject(
// Guardar instancia
metaOriginal = gson.fromJson(meta.toStrin
// Setear valores de la meta
cargarViews(metaOriginal);
break;
case "2":
String mensaje = response.getString("mens
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de falla
getActivity().setResult(Activity.RESULT_C
// Terminar actividad
getActivity().finish();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* Carga los datos iniciales del formulario con los
* atributos de un objeto {@link Meta}
*
* @param meta Instancia
*/
private void cargarViews(Meta meta) {
// Seteando valores de la respuesta
titulo_input.setText(meta.getTitulo());
descripcion_input.setText(meta.getDescripcion());
fecha_text.setText(meta.getFechaLim());
// Obteniendo acceso a los array de strings para cate
String[] categorias = getResources().getStringArray(R
String[] prioridades = getResources().getStringArray(
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

58/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Obteniendo la posición del spinner categorias
int posicion_categoria = 0;
for (int i = 0; i < categorias.length; i++) {
if (categorias[i].compareTo(meta.getCategoria())
posicion_categoria = i;
break;
}
}
// Setear selección del Spinner de categorías
categoria_spinner.setSelection(posicion_categoria);
// Obteniendo la posición del spinner de prioridades
int posicion_prioridad = 0;
for (int i = 0; i < prioridades.length; i++) {
Log.d(TAG, "posición:" + i);
if (prioridades[i].compareTo(meta.getPrioridad())
posicion_prioridad = i;
break;
}
}
// Setear selección del Spinner de prioridades
prioridad_spinner.setSelection(posicion_prioridad);
}
/**
* Compara los datos actuales con aquellos que se obtuvie
* por primera vez en la respuesta HTTP
*
* @return true si los datos no han cambiado, de lo contr
*/
public boolean validarCambios() {
return metaOriginal.compararCon(obtenederDatos());
}
/**
* Retorna en una nueva meta creada a partir
* de los datos del formulario actual
*
* @return Instancia {@link Meta}
*/
private Meta obtenederDatos() {
String
String
String
String
String
titulo = titulo_input.getText().toString();
descripcion = descripcion_input.getText().toSt
fecha = fecha_text.getText().toString();
categoria = (String) categoria_spinner.getSele
prioridad = (String) prioridad_spinner.getSele
return new Meta("0", titulo, descripcion, fecha, cate
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true); // Contribución a la AB
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:// CONFIRMAR
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

59/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
if (!validarCambios())
guardarMeta();
else
// Terminar actividad, ya que no hay camb
getActivity().finish();
return true;
case R.id.action_delete:// ELIMINAR
mostrarDialogo(R.string.dialog_delete_msg);
break;
case R.id.action_discard:// DESCARTAR
if (!validarCambios()) {
mostrarDialogo(R.string.dialog_discard_ms
} else
// Terminar actividad, ya que no hay camb
getActivity().finish();
break;
}
;
return super.onOptionsItemSelected(item);
}
/**
* Guarda los cambios de una meta editada.
* <p>
* Si está en modo inserción, entonces crea una nueva
* meta en la base de datos
*/
private void guardarMeta() {
// Obtener valores actuales de los controles
final String titulo = titulo_input.getText().toString
final String descripcion = descripcion_input.getText(
final String fecha = fecha_text.getText().toString();
final String categoria = categoria_spinner.getSelecte
final String prioridad = prioridad_spinner.getSelecte
HashMap<String, String> map = new HashMap<>();// Mape
map.put("idMeta", idMeta);
map.put("titulo", titulo);
map.put("descripcion", descripcion);
map.put("fechaLim", fecha);
map.put("categoria", categoria);
map.put("prioridad", prioridad);
// Crear nuevo objeto Json basado en el mapa
JSONObject jobject = new JSONObject(map);
// Depurando objeto Json...
Log.d(TAG, jobject.toString());
// Actualizar datos en el servidor
VolleySingleton.getInstance(getActivity()).addToReque
new JsonObjectRequest(
Request.Method.POST,
Constantes.UPDATE,
jobject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject
procesarRespuestaActualizar(r
}
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

60/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(Volle
Log.d(TAG, "Error Volley: " +
}
}
) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> headers = new Has
headers.put("Content-Type", "applicat
headers.put("Accept", "application/js
return headers;
}
@Override
public String getBodyContentType() {
return "application/json; charset=utf
}
}
);
}
/**
* Procesa todos las tareas para eliminar
* una meta en la aplicación. Este método solo se usa
* en la edición
*/
public void eliminarMeta() {
HashMap<String, String> map = new HashMap<>();// MAPE
map.put("idMeta", idMeta);// Identificador
JSONObject jobject = new JSONObject(map);// Objeto Js
// Eliminar datos en el servidor
VolleySingleton.getInstance(getActivity()).addToReque
new JsonObjectRequest(
Request.Method.POST,
Constantes.DELETE,
jobject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject
// Procesar la respuesta
procesarRespuestaEliminar(res
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(Volle
Log.d(TAG, "Error Volley: " +
}
}
) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> headers = new Has
headers.put("Content-Type", "applicat
headers.put("Accept", "application/js
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

61/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
return headers;
}
@Override
public String getBodyContentType() {
return "application/json; charset=utf
}
}
);
}
/**
* Procesa la respuesta de eliminación obtenida desde el
*/
private void procesarRespuestaEliminar(JSONObject respons
try {
// Obtener estado
String estado = response.getString("estado");
// Obtener mensaje
String mensaje = response.getString("mensaje");
switch (estado) {
case "1":
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de éxito
getActivity().setResult(203);
// Terminar actividad
getActivity().finish();
break;
case "2":
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de falla
getActivity().setResult(Activity.RESULT_C
// Terminar actividad
getActivity().finish();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* Procesa la respuesta de actualización obtenida desde e
*/
private void procesarRespuestaActualizar(JSONObject respo
try {
// Obtener estado
String estado = response.getString("estado");
// Obtener mensaje
String mensaje = response.getString("mensaje");
switch (estado) {
case "1":
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

62/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de éxito
getActivity().setResult(Activity.RESULT_O
// Terminar actividad
getActivity().finish();
break;
case "2":
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de falla
getActivity().setResult(Activity.RESULT_C
// Terminar actividad
getActivity().finish();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* Actualiza la fecha del campo {@link fecha_text}
*
* @param ano Año
* @param mes Mes
* @param dia Día
*/
public void actualizarFecha(int ano, int mes, int dia) {
// Setear en el textview la fecha
fecha_text.setText(ano + "-" + (mes + 1) + "-" + dia)
}
/**
* Muestra un diálogo de confirmación, cuyo mensaje esta
* basado en el parámetro identificador de Strings
*
* @param id Parámetro
*/
private void mostrarDialogo(int id) {
DialogFragment dialogo = ConfirmDialogFragment.
createInstance(
getResources().
getString(id));
dialogo.show(getFragmentManager(), "ConfirmDialog");
}
}
Este código es un poco largo debido a que tenemos la
implementación de diálogos y comunicaciones de datos. Por lo

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
63/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
que a continuación te explico la esencia de las peticiones de
información.
Cargar los datos de la meta en los componentes del
formulario: En el método onCreateView() obtenemos el valor
extra con que fue creado el fragmento. Si existe un valor extra,
lanzamos la misma petición que hemos usado para conseguir el
detalle de la meta con el método cargarDatos() .
Inmediatamente los datos conseguidos en la petición, los
seteamos en cada view del formulario.
Manejar los eventos en cada action button: Para lograr esta
tarea se implementó el método onOptionsItemSelected() ,
donde se creó una estructura switch que permitiera la ejecución
del método correspondiente a la acción. Recuerda usar
onHasOptionMenu() en onCreate() para que el fragmento
pueda escuchar los eventos de la action bar.
Implementar la inserción, eliminación y borrado de las metas:
Cada operación en la base de datos tiene un método asignado
para
su
realización. Estos son:
guardarMeta()
y
borrarMeta() . El primer método realiza una petición POST con
la respectiva URL del servicio de actualización, usando los
valores actuales del formulario.
Similarmente borrarMeta() envía el id de la meta que se
desea eliminar hacia la dirección correspondiente.
En cuanto a los diálogos, simplemente usamos el formato
clásico de ACEPTAR|CANCELAR para permitir o no el efecto de
los métodos en la base de datos. Puedes encontrar la
implementación completa descargando el código en la parte
superior del artículo.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
64/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Paso #11: Realizar petición para
insertar nuevos registros
La inserción de nuevas metas la crearemos en una nueva
actividad llamada InsertActivity junto a un fragmento
InsertFragment . Haremos exactamente lo mismo que hemos
venido haciendo.
Iniciaremos el fragmento y estaremos a la espera de que el
usuario guarde los datos o los descarte. Veamos:
InsertActivity.java

import
import
import
import
android.os.Bundle;
android.support.v4.app.DialogFragment;
android.support.v7.app.AppCompatActivity;
android.view.Menu;
import
import
import
import
com.herprogramacion.iwish.R;
com.herprogramacion.iwish.ui.fragmentos.ConfirmDialogF
com.herprogramacion.iwish.ui.fragmentos.DatePickerFrag
com.herprogramacion.iwish.ui.fragmentos.InsertFragment
public class InsertActivity extends AppCompatActivity
implements DatePickerFragment.OnDateSelectedListener,
ConfirmDialogFragment.ConfirmDialogListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getSupportActionBar() != null)
getSupportActionBar().setHomeAsUpIndicator(R.mipm
// Creación del fragmento de inserción
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new InsertFragment()
.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_form, menu);
return true;
}
@Override
public void onDateSelected(int year, int month, int day)
InsertFragment insertFragment = (InsertFragment)
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

65/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
getSupportFragmentManager().findFragmentByTag
if (insertFragment != null) {
insertFragment.actualizarFecha(year, month, day);
}
}
@Override
public void onDialogPositiveClick(DialogFragment dialog)
InsertFragment insertFragment = (InsertFragment)
getSupportFragmentManager().findFragmentByTag
if (insertFragment != null) {
finish(); // Finalizar actividad descartando camb
}
}
@Override
public void onDialogNegativeClick(DialogFragment dialog)
InsertFragment insertFragment = (InsertFragment)
getSupportFragmentManager().findFragmentByTag
if (insertFragment != null) {
// Nada por el momento
}
}
}
Ahora
el
fragmento
de
inserción
tiene
las
siguientes
características:
InsertFragment.java
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.support.v4.app.DialogFragment;
android.support.v4.app.Fragment;
android.util.Log;
android.view.LayoutInflater;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
android.view.View;
android.view.ViewGroup;
android.widget.EditText;
android.widget.Spinner;
android.widget.TextView;
android.widget.Toast;
import
import
import
import
import
import
import
com.android.volley.Request;
com.android.volley.Response;
com.android.volley.VolleyError;
com.android.volley.toolbox.JsonObjectRequest;
com.herprogramacion.iwish.R;
com.herprogramacion.iwish.tools.Constantes;
com.herprogramacion.iwish.web.VolleySingleton;

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

66/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* Fragmento que permite al usuario insertar un nueva meta
*/
public class InsertFragment extends Fragment {
/**
* Etiqueta para depuración
*/
private static final String TAG = InsertFragment.class.ge
/*
Controles
*/
EditText titulo_input;
EditText descripcion_input;
Spinner prioridad_spinner;
TextView fecha_text;
Spinner categoria_spinner;
public InsertFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Habilitar al fragmento para contribuir en la actio
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGro
Bundle savedInstanceState) {
// Inflando layout del fragmento
View v = inflater.inflate(R.layout.fragment_form, con
// Obtención de instancias controles
titulo_input = (EditText) v.findViewById(R.id.titulo_
descripcion_input = (EditText) v.findViewById(R.id.de
fecha_text = (TextView) v.findViewById(R.id.fecha_eje
categoria_spinner = (Spinner) v.findViewById(R.id.cat
prioridad_spinner = (Spinner) v.findViewById(R.id.pri
fecha_text.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePicke
picker.show(getFragmentManager(), "da
}
}
);
return v;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater i
super.onCreateOptionsMenu(menu, inflater);
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

67/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Remover el action button de borrar
menu.removeItem(R.id.action_delete);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:// CONFIRMAR
if (!camposVacios())
guardarMeta();
else
Toast.makeText(
getActivity(),
"Completa los campos",
Toast.LENGTH_LONG).show();
return true;
case R.id.action_discard:// DESCARTAR
if (!camposVacios())
mostrarDialogo();
else
getActivity().finish();
break;
}
return super.onOptionsItemSelected(item);
}
/**
* Guarda los cambios de una meta editada.
* <p>
* Si está en modo inserción, entonces crea una nueva
* meta en la base de datos
*/
public void guardarMeta() {
// Obtener valores actuales de los controles
final String titulo = titulo_input.getText().toString
final String descripcion = descripcion_input.getText(
final String fecha = fecha_text.getText().toString();
final String categoria = categoria_spinner.getSelecte
final String prioridad = prioridad_spinner.getSelecte
HashMap<String, String> map = new HashMap<>();// Mape
map.put("titulo", titulo);
map.put("descripcion", descripcion);
map.put("fechaLim", fecha);
map.put("categoria", categoria);
map.put("prioridad", prioridad);
// Crear nuevo objeto Json basado en el mapa
JSONObject jobject = new JSONObject(map);
// Depurando objeto Json...
Log.d(TAG, jobject.toString());
// Actualizar datos en el servidor
VolleySingleton.getInstance(getActivity()).addToReque
new JsonObjectRequest(
Request.Method.POST,
Constantes.INSERT,
jobject,
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

68/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject
// Procesar la respuesta del
procesarRespuesta(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(Volle
Log.d(TAG, "Error Volley: " +
}
}
) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> headers = new Has
headers.put("Content-Type", "applicat
headers.put("Accept", "application/js
return headers;
}
@Override
public String getBodyContentType() {
return "application/json; charset=utf
}
}
);
}
/**
* Procesa la respuesta obtenida desde el sevidor
*
* @param response Objeto Json
*/
private void procesarRespuesta(JSONObject response) {
try {
// Obtener estado
String estado = response.getString("estado");
// Obtener mensaje
String mensaje = response.getString("mensaje");
switch (estado) {
case "1":
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de éxito
getActivity().setResult(Activity.RESULT_O
// Terminar actividad
getActivity().finish();
break;
case "2":
// Mostrar mensaje
Toast.makeText(
getActivity(),
mensaje,
Toast.LENGTH_LONG).show();
// Enviar código de falla
getActivity().setResult(Activity.RESULT_C
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

69/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
// Terminar actividad
getActivity().finish();
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* Valida si los campos {@link titulo_input} y {@link des
* se han rellenado
*
* @return true si alguno o dos de los campos están vacio
* están completos
*/
public boolean camposVacios() {
String titulo = titulo_input.getText().toString();
String descripcion = descripcion_input.getText().toSt
return (titulo.isEmpty() || descripcion.isEmpty());
}
/**
* Actualiza la fecha del campo {@link fecha_text}
*
* @param ano Año
* @param mes Mes
* @param dia Día
*/
public void actualizarFecha(int ano, int mes, int dia) {
// Setear en el textview la fecha
fecha_text.setText(ano + "-" + (mes + 1) + "-" + dia)
}
/**
* Muestra un diálogo de confirmación
*/
public void mostrarDialogo() {
DialogFragment dialogo = ConfirmDialogFragment.
createInstance(
getResources().
getString(R.string.dialog_dis
dialogo.show(getFragmentManager(), "ConfirmDialog");
}
}
Esta vez hemos creado un método llamado guardarMeta()
basado en la URL del servicio de inserción y los datos que el
usuario haya completado. Si te jas en el procesamiento de los
eventos sobre la action bar, puedes ver que existe la posibilidad
de guardar y descartar los datos.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
70/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Ambos se basan en la validación de los campos del formulario
que requieren texto escrito por parte del usuario. Para ello se
creó el método camposVacios() . Dependiendo de su retorno
así mismo procederemos.
Esto quiere decir que el usuario no puede guardar una meta sin
completar alguno de los campos. Ni tampoco puede intentar
descartar cambios sin ver un diálogo si ya ha escrito algún dato.
Ejecutar Proyecto Completo En
Android Studio
Recuerda que puedes descargar el proyecto completo con el
botón que tienes en el inicio del artículo. Al nal, luego de haber
seguido todos los pasos la aplicación se verá así:

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
71/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Conclusiones
Usar un Web Service en Php permite compartir datos entre tus
aplicativos externos y tus aplicaciones android para mantener un
proyecto integral. Sin embargo el uso de un estilo de
comunicación elegante como REST es
complemento para estructurar una buena API.
un
excelente
Json es un formato muy exible y cómodo a la vista. Esto lo
hace un excelente complemento para implementar una API entre
Android, Mysql y Php.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
72/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Añade caching de información a través de SQLite para evitar
realizar gran cantidad de operaciones de red.
Usa la clase ContentProvider para completar tu patrón MVC
de Red y añadir restricciones RESTful en tu aplicación. Esto te
permitirá independizar tus clases y evitar problemas en tu hilo
principal de forma sencilla.
¿Necesitas Otro Ejemplo De Servicio
Web?
Hace unos días lancé un tutorial detallado para crear un servicio
web REST para productos, clientes y pedidos. Donde consumo
sus recursos desde una aplicación llamada App Productos.
Échale un vistazo a todo lo que incluye (tutorial PDF, código
completo en Android Studio, código completo PHP, script MySQL
con 100 productos de ejemplo).

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
73/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Publicidad En Google
Crear Login En
MongoDB® Atlas
Android Con Retrofit...
Tutorial De Bases De
Datos SQLite En...
Anuncio Google Ads
hermosaprogramacion.com
hermosaprogramacion.com
Anuncio MongoDB Atlas
¿Demasiadas deudas? Diseñar Base De Datos App Productos 4:
De Un Sistema De...
Creación De Facturas
¿Cómo Sincronizar
Sqlite Con Mysql En...
Anuncio Resuelve tu Deuda
hermosaprogramacion.com
Comentarios
hermosaprogramacion.com
1

Comunidad
 Recomendar 11
t Tweet
hermosaprogramacion.com
Acceder
f Compartir
Ordenar por los mejores
Únete a la conversación...
INICIAR SESIÓN CON
O REGISTRARSE CON DISQUS ?
Nombre
James
Moderador
• hace 4 años
Hola compañeros.
Para todos aquellos que tengan el problemas de los
caracteres  al momento del parsing en la aplicación, la
solución ya está. Todo gracias al amigo @Maximiliano
Doñate.
Resulta que el IDE que estoy usando ha encodificado
todos los archivos del proyecto web en el formato UTF-8.
Los caracteres raros que se agregan se les denomina
BOM. Estos permiten marcar el orden de los bytes que se
verán en el archivo. Si el servidor que usan no tiene
habilitado el charset para UTF-8, entonces surgirán los
problemas.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

74/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
La solución está en cambiar el charset al formato que más
se te ajuste en tu editor. O si quieren, intentar copiar y
pegar el texto de cada archivo en nuevos ficheros.
Sin embargo acabo de convertir todos los ficheros a
windows-1252. Descarguen de nuevo el proyecto desde
el botón superior del articulo y pruebenlo.
Espero que con ello todos puedan solucionar el problema.
Si encuentran otros problemas me lo hacen saber.
Saludos :D
3△
▽ • Responder • Compartir ›
Julio Vergara > James • hace 4 años
Saludos James, ya funciona, sin embargo, el nuevo
IWish de Android que subiste tiene algunas cosas
que hay que modificar en "Constantes.java" para
que funcione bien.... en la línea private static final
String IP = "http://10.0.3.2"; hay que eliminar el
http:// (los que usen el AVD que trae Android Studio
en lugar de Genymotion deben cambiarla por la IP
de su equipo) así mismo en las líneas en donde
defines las constantes para cada uno de los php
del web service tienes I%20Wish, sin embargo el
nuevo proyecto que subiste no tiene ese espacio
en blanco, por lo que simplemente borramos en
cada linea el %20 y listo....otra cosa es que hay
que editar el puerto a 80 asi private static final
String PUERTO_HOST = ":80" para las
instalaciones por defecto (para los que usan mysql
en una instalación por defecto, en el archivo
Database.php cambien el puerto a 3306 en la línea
58) Saludos.
1△
▽ • Responder • Compartir ›
Bladimir > Julio Vergara • hace 3 años
Estimado, tiene que dejar los archivos en
utf-8 y agregar la siguiente linea al Archivo
Database.php charset=utf8 por ejemplo
quedaría así
⛺
△ ▽ • Responder • Compartir ›
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

75/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
abrkof > Julio Vergara • hace 3 años
hola Julio... tengo un problema... soy novato
en todo esto de android y estoy tratando de
probar el IWish y no me funciona... solo lo
trato de correro pero me tira el siguiente
mensaje de error.
podrias despejarme esa duda? ya le di click
donde dice sync project pero luego me tira
otro error.
gracias de ante mano!
⛺
⛺
△ ▽ • Responder • Compartir ›
Julio Vergara > abrkof
• hace 3 años
Saludos, según lo que puedo ver en
las capturas, no tienes definido un
sdk por defecto en Android Studio,
tienes instalado el java jdk? Si lo
tienes al parecer Android Studio no
lo encuentra
△ ▽ • Responder • Compartir ›
Alex Ticse > Julio Vergara • hace 3 años
gracias man tu comentario me ayudo mucho
me ayudaste con las dudas que tenia
△ ▽ • Responder • Compartir ›
Julio Vergara > Alex Ticse
• hace 3 años
Me alegra que te haya servido,
suerte
△ ▽ • Responder • Compartir ›
Ali Lopez Galaviz > Julio Vergara
• hace 3 años

Soy Novato en esto, estoy trabajando desde
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
76/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Soy o ato e esto, estoy t abaja do desde
un dispositivo porque mi computadora no
tiene los suficientes recursos, entonces mi
pregunta es, si subo los archivos php a un
servidor, como me comunico hacia tal
server, tambien tengo duda en
Constantes.java en la parte de String IP,
creo esa ip es para cuando trabajamos con
AVD, y si trabajo con un dispositivo real, que
debo de hacer? espero sus respuestas.
Saludos
△ ▽ • Responder • Compartir ›
Guillermo Vargas > Ali Lopez
Galaviz • hace 3 años
Hola una pregunta los archivos php
los colocaste en la carpeta htdocs de
xampp??
△ ▽ • Responder • Compartir ›
Moderador > Guillermo
Vargas • hace 3 años
James
Si compañero. Si vas a usar un
sevicio de hosting incluyelos en la
carpeta public_html (frecuentemente
se llama asi)
△ ▽ • Responder • Compartir ›
Guillermo Vargas > James
• hace 3 años
ok gracias entendido, oye tengo un
problema espero me puedas
orientar, llevo dias tratando de
adaptar unicamente la parte de
insertar de este tutorial en un
proyecto que estoy realizando, pero
en mi formulario no utilizo fragments
(aunque visualmente la parte de
insertar es muy similar al tuyo, utilizo
EditText del tipo parson name, de
tipo date y spinners), bueno voy al
grano yo lo unico que quiero que
haga mi aplicacion es insertar pero
como tu proyecto tambien, actualiza,
elimina, muestra, me marca muchos
errores en la parte de java, en php
ya logre dejar unicamente el codigo
para insertar espero me puedas
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

77/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
para insertar, espero me puedas
orientar ya busque en la red y no
encuentro ningun tutorial parecido a
lo que necesito mas que el tuyo, por
cierto lo de insertar en mi proyecto
ya lo puedo hacer desde una pagina
web pero desde una aplicacion
android hay muchas cosas diferentes
y soy novato en android.... Saludos
△ ▽ • Responder • Compartir ›
Moderador > Ali Lopez
Galaviz • hace 3 años
James
Usa los datos reales de tu dispositivo
compañero
△ ▽ • Responder • Compartir ›
Ali Lopez Galaviz > James
• hace 3 años
Muchas gracias, el tutorial me sirvio
mucho, y cada uno me ha ayudado a
nutrir mis conocimientos, gracias!
△ ▽ • Responder • Compartir ›
Jose H. > Ali Lopez Galaviz
• hace 3 años
Que tal amigo, y que ip utilizaste
para emular el ejemplo en tu movil?
△ ▽ • Responder • Compartir ›
Ali Lopez Galaviz > Jose H.
• hace 3 años
Mira, si estas trabajando en local, la
ip que use es la de mi ordenador, en
mi caso fue en Windows, por lo cual
use el comando ip config para
obtener la ip de mi ordenador, el
problema aquí es que la ip va
cambiando, por lo cual cada vez que
inicies el ordenador, puede dar el
caso que tu ip cambie, espero
haberte resuelto tu duda. Saludos.
△ ▽ • Responder • Compartir ›
Santiago Orozs > Julio Vergara
• hace 4 años
Saludos Julian y Jamas, tengo un problema
en la petición del GET obtener_metas.php ,
l
h
d ll
l
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

78/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
lo corro ha paso a pasa y cuendo llega el
metodo public void cargarAdaptador() el se
sale ps creo que la peticion del GET esta
mal o la verdad no se me pueden colaborar
por favor ?
Corro el AP en Genymotion.
△ ▽ • Responder • Compartir ›
James Moderador > Santiago
Orozs • hace 4 años
Como dice Julio, insertar una imagen
con la opción en la parte inferior
izquierda de tu caja de comentario
disquss.
△ ▽ • Responder • Compartir ›
Julio Vergara > Santiago Orozs
• hace 4 años
Saludos, sería muy útil si pones una
captura de pantalla o específicas
bien el error que te da
△ ▽ • Responder • Compartir ›
Santiago Orozs > Julio Vergara
• hace 4 años
Saludos, Primero disculparme por
cambiarle los nombre a los dos
"Julio" y "James", y segundo gracias
por contestarme =). Les adjunto las
captura de pantalla.
Son 4 imágenes.
Una muestra el panel de control de
xampp.
Otra el web servicies que funciona.
Y la modificación de Database.php
como dijo Julian.
Y la ultima es la de android donde
esta haciendo la petición GET en el
método cargarAdaptador el cuando
ver más
△ ▽ • Responder • Compartir ›
Julio Vergara > Santiago Orozs
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

79/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Julio Vergara > Santiago Orozs
• hace 4 años
Saludos, manda una captura de
pantalla del archivo Constantes.java
que está en la app android por favor
△ ▽ • Responder • Compartir ›
Santiago Orozs > Julio Vergara
• hace 4 años
Gracias Julio pude con el
inconveniente solo cambie los String
de las peticiones
public static final String GET =
"http://" + IP + PUERTO_HOST +
"/I_Wish/obtener_metas.php";
.........................................
la tenia
public static final String GET =
"http://" + IP + PUERTO_HOST + "/I
Wish/obtener_metas.php";
Solo en el I Wish le puse I_Wish ya
que mire Logcat fue donde pude
mirar el error.
ver más
△ ▽ • Responder • Compartir ›
James Moderador > Santiago
Orozs • hace 4 años
Que bien compañero. Esas
direcciones pueden confundir ya que
las instalaciones de todos no son
igual.
△ ▽ • Responder • Compartir ›
Julio Vergara > Santiago Orozs
• hace 4 años
De nada Santiago, que bueno que te
funcionó...
△ ▽ • Responder • Compartir ›
Santiago Orozs > Julio Vergara
• hace 4 años
Muchas Gracias.
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

80/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Otra Pregunta como puedo
comprobar los WebServicies.
Por ejemplo hacerles pruebas antes
de hacer el código de la petición de
post en android.
△ ▽ • Responder • Compartir ›
Jaime Tellez > Santiago Orozs
• hace 4 años
puedes añadir este pequeño código
en tu php servicie, para q
introduzcas en este caso tu id o lo
que necesite el webservice y
testearlo.
ejemplo con el de consultar meta por
id
eso lo hace con un
if(!empty(variable_método)){} para qe
preguntes si el método no esta vació,
pues haces el código de arriba, si no,
pues sigue su curso ya que vienen
los datos de la app.
?>
<h1>Consultar por ID</h1>
<form
action="obtener_meta_por_id.php"
method="aquí va el método">
ID de la meta:
<input type="text" name="aquí la
variable q vas a utilizar(idMeta)"
value=""/>
<input type="submit"
value="Consultar"/>
</from>
1△
▽ • Responder • Compartir ›
Jaime Tellez > Jaime Tellez
• hace 4 años
espues del from va < ? p h p,
pegado, si lo pongo junto no sale
△ ▽ • Responder • Compartir ›
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

81/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
Julio Vergara > Santiago Orozs
• hace 4 años
Fácil, usando otro archivo php que le
envíe a tu webservice los datos que
enviarias con tu app android; sería
una especie de simulador. También
usando una app de chrome que se
llama Advanced Rest Client...hay
varias alternativas para hacer eso
1△
▽ • Responder • Compartir ›
James Moderador > Julio Vergara
• hace 4 años
Ok Julio. Acabo de cambiar la IP en el
proyecto para descargar. Gracias por tus
comentarios. Al fin se solucionó el dilema :D
△ ▽ • Responder • Compartir ›
Josee Naava > James • hace 3 años
amigo una pregunta: se supone que al guardar te
deberia de mostrar el mensaje Creación éxitosa y
mandarte a otro fragment? porque ni me muestra el
mensaje ni me manda a otro fragmento
△ ▽ • Responder • Compartir ›
Juan Ramos > James • hace 4 años
Hola.
Muchas gracias por el tutorial.
¿Respecto al diagrama que aparece en el punto (3)
usaste alguna aplicación en particular?
△ ▽ • Responder • Compartir ›
James Moderador > Juan Ramos
• hace 4 años
Hola Juan.
Usé ninjamock.com, es muy bueno
1△
▽ • Responder • Compartir ›
Hernandez Estrambotico • hace 3 años
problema con
Error Volley: com.android.volley.NoConnectionError:
java.net.ConnectException: failed to connect to /127.0.0.1
(port 80) after 2500ms: isConnected failed:
ECONNREFUSED (Connection refused)

No me conecta a mi localhost, ya cambie puerto pero
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
82/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
y
sigue sin poder conectar a localhost.
p
p
y gracias por la atencion, excelente pagina
2△
▽ • Responder • Compartir ›
ivanAndro117 • hace 3 años
Hola muy buen día, disculpa tengo una duda con respecto
al fetch que haces en el archivo metas.php pues hay un
campo al que necesito aplicar base64_encode ya que no
tengo mucho conocimiento sobre este tema no tengo idea
de como cambiar el fetch para aplicar lo que necesito,
¿Me podrías ayudar?
2△
▽ • Responder • Compartir ›
Jaime Tellez • hace 4 años
hola amigos, primero q todo felicitar a james por su gran
trabajo, segundo, hacer una consulta acerca de este error
q me aparece, espero me puedan ayudar.
2△
▽ • Responder • Compartir ›
Jaime Tellez > Jaime Tellez • hace 4 años
aquí mas detallado mi error
1△
▽ • Responder • Compartir ›
James Moderador > Jaime Tellez
• hace 4 años
Hola Jaime.
Me parece que estás usando Volley con la
librería de github. ¿Has probado poner
(String)null en el tercer parámetro de la
petición?
http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/

83/84
2/3/2019
Crear Un Web Service Para Android Con Mysql, Php y Json
p
Parece que este constructor no acepta
directamente el valor de null, debe ir ese
casting.
1△
▽ • Responder • Compartir ›
Jaime Tellez > James
• hace 4 años
si, era eso, muchas gracias amigo,
disculpa la molestia, pero me salta
una duda, en tu caso el id de las
metas es autoincremental, pero si yo
trabajo un id q no auto incrementa, si
no que lo da el usuario, ¿como
verifico que ese id ya existe en la
base de datos? gracias de
antemano!
1△
▽ • Responder • Compartir ›
Premio Top 80 Mobile App Blogs de Feedspot
Hermosa Programación: +50 Tutoriales Desarrollo Android Copyright © 2019.

http://www.hermosaprogramacion.com/2015/05/crear-un-webservice-para-android-con-mysql-php-y-json/
84/84
Descargar