7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 1/113
Consumir Un Servicio Web REST Desde Android
diciembre 28, 2015 James Revelo
En este artículo te mostraré como consumir un servicio web RESTful basado en el artículo asado! "a idea es mostrar con un e#emloen $ndroid Studio, una sincroni%aci&n comleta ara una a $ndroid de contactos!
"o rimero 'ue (aremos ser) definir el alcance de la alicaci&n $ndroid, ara determinar el uso de sus funciones! "ue*oestableceremos unos re'uerimientos (iotéticos necesarios ara mane#ar el +R- del servicio web!
También te mostraré un dise.o de la base de datos / la forma en 'ue la imlementé en /s'l ara 'ue la sincroni%aci&n sea efectiva!
$dem)s esbo%aré los elementos visuales de la a a través de un dia*rama con wireframin*!inalmente veremos c&mo crear la alicaci&n comleta en $ndroid Studio ara llevar a cabo oeraciones locales / remotas sobre las bases de datos en S"ite / /s'l!
$ continuaci&n te muestro el resultado final de la alicaci&n “PeopleApp”! Recuerda 'ue uedes descar*ar el ro/ecto comleto en$ndroid Studio comartiendo este artículo con tu red social favorita!
-ES+$R3$R +4-36
Desarrollar Aplicación Android De Contactos
+omo /a sabes, la alicaci&n $ndroid mane#ar) un +R- de contactos ersonales ara los usuarios 'ue usen la a! 7o ser) una acorta, or lo 'ue i*noraré en el desarrollo la creaci&n de la versi&n ara tabletas o ara la osici&n landscae, con el fin de reducir elartículo a un material comresible!
El lo*in de la a no lo tocaremos en este artículo, ero de se*uro ser) el r&imo un r&imo tema ara el blo*!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 2/113
i ob#etivo es mostrarte directamente una estrate*ia de sincroni%aci&n de datos entre el servidor / la a a través de nuestro servicioweb!
$(ora, la metodolo*ía en 'ue te mostraré el traba#o est) constituida or las si*uientes etaas9
• -eterminar Re'uerimientos -e "a $
• +rear :ireframmin* de la $
• -ise.o -e "a ;ase -e -atos <ara /s'l
• Etender Servicio REST +on 6eraciones En ;atc(
• -esarrollo -e "a $licaci&n
• +rear 7uevo <ro/ecto En $ndroid Studio
o +rear "ista -e +ontactos
o +rear $ctividad -e nserci&n
o sar $ctividad -e nserci&n <ara odificar
o Eliminar +ontactos -e "a $licaci&n
o Sincroni%ar El +liente $ndroid
o Sincroni%ar El Servidor +on <( / /s'l
+on esto en mente, =arran'uemos>
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 3/113
#! Re"uerimiento Para Consumir Un Servicio Web
"as características de la a /a las (abía mencionado arriba de forma *eneral, sin embar*o anotarlas nos vendría bien!
"a a de contactos debe tener las si*uientes eticiones del usuario (iotético9
• Como Usuario hipotético, deseo guardar el primer nombre, primer apellido, teléfono y correo de mis contactos personales y
verlos en una lista.
• Como Usuario hipotético, deseo modificar los datos de un contacto existente.
• Como Usuario hipotético, deseo eliminar contactos.
• Como Usuario hipotético, quiero que los cambios que haga en mi app Android se vean reflejados en mi cuenta web y
viceversa.
"os tres rimeros re'uerimientos odríamos a*ruarlos en “Administrar los contactos”, sin embar*o or racticidad / orden refiero'ue los entiendas de esa forma!
Selección de estrateia para sincroni$ación
Es etremadamente imortante 'ue en esta secci&n aclares la estrateia de sincroni$ación 'ue usar)s en tu alicaci&n! na de la
forma m)s sencilla de (acerlo es esecificando 'ue arte ser) la m)s reonderante a la (ora de relicar la informaci&n!
En mi caso tanto el servidor como el cliente tendr)n el mismo eso! "o 'ue 'uiere decir, 'ue los re*istros locales / remotos debenconservarse en las mismas condiciones! Sum)ndole 'ue el roceso de sincroni%aci&n ser) or demanda!
or ejemplo!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 4/113
Su&n 'ue la alicaci&n $ndroid no osee nin*?n contacto or el momento! -el otro lado tenemos al servidor <( con un contacto /acreado desde la alicaci&n web!
" #$ué pasar%a si se iniciara una sincroni&aci'n en ese preciso instante seg(n lo que mencioné)
El re*istro del cliente se coiaría en la base de datos S"ite de la alicaci&n $ndroid!
@ Ahora, #$ué suceder%a en caso contrario)
Es decir, 'ue el cliente ten*a un contacto local creado, ero 'ue el servidor a?n no osea re*istros!
Respuesta% el re*istro se coiaría en la base de datos /s'l, /a 'ue el re*istro es tratado como rioritario!
Este comortamiento se uede resumir en la si*uiente ilustraci&n9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 5/113
+uando se trata de las oeraciones sencillas de forma aislada no eisten roblemas, ero las cosas se onen comle#as cuando unmismo re*istro es editado tanto en el cliente como en el servidor antes de la sincroni%aci&n!
Este tio de conflictos ueden ser solucionados de muc(as formas osibles, ero or suuesto todo deende!<ara <eole$ decidí usar una estrateia de marcas de tiempo ×tamps' ara comarar las fec(as de modificaci&n / ele*ir alm)s reciente!
*jemplo!
El contacto C( fue editado desde el cliente el +-+-+/ a las /pm! "ue*o se edit& en el servidor ese mismo día a las 0pm! $ las 1pm se reali%& una sincroni%aci&n entre ambas artes!
" #$ué versi'n crees que sobrevivi')
"a del servidor! 6bviamente or'ue es el dato m)s reciente como lo (abía mencionado! $sí 'ue se reali%a una rélica en el re*istrolocal!
)*s estrateias de sincroni$ación
+ada a es distinta, en consecuencia no todas las estrate*ias ser)n las correctas ara tu caso articular!
n buen caso sería en donde tu aplicación Android actua como un receptor de las +ltimas noticias de tu ,eb! Si me re*untas 'ue
arte es m)s reonderante, /o diría 'ue el servidor! Aa 'ue el ori*en de los datos est) basado en tu web, or lo 'ue la a m&vil nocontribu/e en nada a la creaci&n de contenido!
$'uí el servidor sería maestro / el cliente un esclavo! -onde sí los re*istros son borrados del servidor, el cliente también tendr) 'uerelicar estas eliminaciones!
Este caso lo vimos cuando creamos un lector RSS!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 6/113
-e la misma forma uede ocurrir 'ue la alicaci&n $ndroid sea el lado maestro / el servidor el esclavo! -onde todo cambio en la atendría ma/or eso 'ue el servidor!
$dicionalmente, en la resoluci&n de conflictos odríamos ele*ir la versi&n m)s anti*ua en ve% de la actual! 6 incluso ele*ir la versi&ndel cliente o servidor se*?n la conveniencia!
$un'ue también eiste la alternativa de roorcionar un control de versiones del re*istro ara 'ue el usuario eli#a el cambio 'ue m)s leconviene!
<iénsatelo mu/ bien / act?a se*?n las olíticas ara rote*er los datos del usuario!
#-! Crear Wire.ramin De /a App
eopleApp es una alicaci&n +R- realmente sencilla / no re'uiere muc(o esfuer%o maear las relaciones de las antallas!
-e los re'uerimientos sabemos 'ue la lista de antallas 'ue tendremos se comone de9
• "ista de contactos
• ormulario de creaci&n de contactos
• ormulario ara edici&n de contactos
Esto reduce nuestra laneaci&n de al si*uiente wireframin*9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 7/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 8/113
#0! )odi.icación De /a 1ase De Datos )2s"l
El si*uiente movimiento es a*re*ar el soorte de versiones ara los re*istros de la tabla 'contacto'!
Esto si*nifica a.adir una nueva columna llamada 3version4 del tio DATETIME! Si en tu caso necesitas la recisi&n de centésimos dese*undo, entonces usa el tio TIMESTAMP!
$l crear este camo le a.adí el activador ON UPDATE CURRENT_TIMESTAMP ara 'ue /s'l actualice autom)ticamente la fec(a! Estome evita crear un tri**er ara asi*nar la fec(a actual!
En c&di*o, la eortaci&n de /s'l me arro#a al si*uiente comando CREATE 9
--
-- Estructura de tabla para la tabla `contacto`--
CREATE TA!E I" NOT E#ISTS `contacto` $ `%dContacto` &arcar$())* NOT NU!!+ `pr%,erNo,bre` &arcar$.* NOT NU!!+ `pr%,erApell%do` &arcar$.* DE"AU!T NU!!+ `tele/ono` &arcar$0.* DE"AU!T NU!!+ `correo` &arcar$()* DE"AU!T NU!!+ `%dUsuar%o` %nt$00* NOT NU!!+ `&ers%on` datet%,e NOT NU!! DE"AU!T CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP* EN1INE2InnoD DE"AU!T C3ARSET2lat%n04
Si deseas reali%arlo a través de php2yAdmin, entonces solo vas a la esta.a “Estructura” / lue*o resionas “Continuar” en lasecci&n de “Arear”!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 9/113
+uando estés en el asistente ara crear la columna, onle el nombre 5&ers%on5, tio DATETIME, valor or defecto CURRENT_TIMESTAMP
/ selecciona el atributo ON UPDATE9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 10/113
#5! Crear 6peraciones En 1atc7 Para El Servicio REST
-e la forma en 'ue ten*o el servicio web REST (asta el momento tendría 'ue enviar *ran cantidad de eticiones ara insertar,
modificar / eliminar contactos!
<onte a ensar! Si tuviésemos 100 contactos a.adidos en la alicaci&n $ndroid, entonces re'ueriré 100 eticiones <6ST (acia elservidor ara relicar la informaci&n!
$un'ue arece 'ue no (a/ roblema, en realidad los disositivos m&viles consumen batería or cada ciclo de envío de eticionesBTT<! +on unas cuantas no (abr) roblema, ero si necesitamos actuali%ar un *ran n?mero de re*istros, entonces debes ens)rtelo dosveces!
<ara solucionar este inconveniente imlementaré oeraciones batc( en el servicio web! Estas no son mas 'ue oeraciones 'ue se
reali%an en blo'ue o lotes de datos ara otimi%ar tratar una sola car*a de datos!
Esto te ermitir) reali%ar las tres oeraciones b)sicas con una sola etici&n de uno o m)s recursos, es decir, insertar, actuali%ar /eliminar con una solo método!
Aplicar batc7 en )2s"l a trav8s de P7p
<ara formar la R 'ue controle el batc( crearé un nuevo arc(ivo llamado s2nc!p7p dentro del directorio controladores!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 11/113
Su ob#etivo es comortarse como un recurso 'ue reresente a todos los recursos eistentes de la base de datos! $sí 'ue loconsultaremos ara enviarle una etici&n con los cambios me%clados u obtener datos!
"a referencia de acciones 'uedaría de la si*uiente forma9
UR9 Descripción
1ET ap%6peopleapp6co,7&07s8nc 6btiene todos los re*istros de la tabla contactosPOST ap%6peopleapp6co,7&07s8nc Envía las inserciones, modificaciones / eliminaciones de re*istros de contactos!
Este recurso adicional mostraría un *ran otencial si tuviésemos m)s de dos tablas! Sin embar*o, con el e#emlo de contactos /atendr)s una l&*ica ara eandir tus as!
6btención de datos en 1atc7
a'! "o rimero 'ue (aré ser) a*re*ar el recurso s2nc a la lista de recursos en el arc(ivo inde:!p7p! Recuerda 'ue esto ermitereconocer las oeraciones!
index.php
9:pp
666re;u%re 'controladores7s8nc6pp'4666
<recursos_e=%stentes 2 arra8$'contactos'+ 'usuar%os'+'s8nc'*4
b'! -ebido a 'ue enviaremos los datos de todas las tablas Cmenos 3usuario4 /a 'ue no necesita sincroni%aci&nD, entonces crearé unalista con los nombres de cada una!
El ro&sito es la lectura con un ciclo /oreac de todos sus elementos ara construir un ob#eto JS67 con los datos de cada una!
sync.php
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 12/113
9:pp
%nclude_once 'datos7Cone=%onD6pp'4
class s8nc> 77 Constantes666
7? A@ade todas los recursos ;ue deseas en&%ar separados por co,a '+' ? ee,ploB arra8$'cl%ente'+ '/actura'+ 'producto'* ?7 publ%c stat%c <tablas 2 arra8$contactosBBTA!A_CONTACTO*4
c'! $(ora escribiré el método *eneral et$* ara rocesar la etici&n 1ET enviada desde el cliente! En esencia, solo debes autori%ar elusuario / lue*o comen%ar a etraer todos los datos!
"a autori%aci&n /a la (abías visto en el artículo anterior con el método autor%ar$*! <ara la consulta a la base de datos usaré unnuevo método llamado obtenerRecursos$*, el cual recibe el filtro de la etici&n / el id del usuario!
Sabiendo esto el c&di*o 'uedaría así9
publ%c stat%c /unct%on et$<se,entos*>
<%dUsuar%o 2 usuar%osBBautor%ar$*4 return sel/BBobtenerRecursos$<%dUsuar%o*4
d'! El método obtenerRecursos$* debe recorrer el arra/ tablas ara consultar todo el contenido de cada una! $ medida 'ue se vanencontrando los re*istros, se van a.adiendo a un arra/ de resuesta, donde la clave de cada tabla ser) su mismo nombre!
pr%&ate /unct%on obtenerRecursos$<%dUsuar%o*>
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 13/113
tr8 > 77 Instanc%a PDO <pdo 2 Cone=%onDBBobtenerInstanc%a$*-FobtenerD$*4
77 Preparar arra8 de parG,etros <para,etros 2 arra8$<%dUsuar%o*4
77 Procesar recursos a en&%ar /oreac $sel/BB<tablas as <tabla* >
77 Consulta enHr%ca del recurso % <co,ando 2 'SE!ECT ? "ROM ' 6 <tabla 6 ' 3ERE ' 6 sel/BBID_USUARIO 6 '2:'4
77 Preparar sentenc%a <sentenc%a 2 <pdo-Fprepare$<co,ando*4
77 Eecutar sentenc%a preparada <sentenc%a-Fe=ecute$<para,etros*4
77 E=traer datos co,o arra8 asoc%at%&o <respuestaJ<tablaK 2 <sentenc%a-F/etcAll$PDOBB"ETC3_ASSOC*4
77 Estado (.. OL ttp_response_code$(..*4
<respuestaJ'estado'K 2 sel/BBESTADO_E#ITO4 <respuestaJ',ensae'K 2 ut/_encode$sel/BBMENSAE_0..*4
return <respuesta4
catc $PDOE=cept%on <e* > tro ne E=cepc%onAp%$sel/BBESTADO_ERROR_D+ <e-FetMessae$**4
n e#emlo de una resuesta JS67 con estado 0.. 6 sería la si*uiente9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 14/113
> 5contacto5B J > 5%dContacto5B 5C-.Qc..d-)cbb-de/-a(-d0eba0/05+
5pr%,erNo,bre5B 5a,es5+ 5pr%,erApell%do5B 5Re&elo5+ 5tele/ono5B 5000Q05+ 5correo5B 5a,es,a%l6co,5+ 5%dUsuar%o5B 5(5+ 5&ers%on5B 5(.0)-0(-( 0(B(B(5 K+ 5estado5B 0..+ 5,ensae5B 5S%ncron%ac%n co,pleta5
+omo ves, (a/ solo un arra/ llamado 3contacto4 con un re*istro de e#emlo! Si (ubiésen mas tablas, entonces aarecerían de la mismaforma con sus resectivos contenidos, ara 'ue los roceses desde la a $ndroid!
Actuali$ación De Datos En 1atc7
Esta tarea es un oco m)s comle#a debido a 'ue /a no enviar)s eticiones individuales or cada oeraci&n, si no 'ue usar)s un solocanal ara todo!
#$ué debes tener en cuenta)
• El método BTT< a usar ara la etici&n batc(!
• "a cantidad de tablas 'ue contribuir)n a la actuali%aci&n masiva!
• El tio de oeraciones 'ue enviar)s or cada tabla!
• "a estructura JS67 o F" del cuero de la etici&n
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 15/113
+uando evalué estas características decidí lo si*uiente9
• El método a usar ser) POST, /a 'ue ermite enviar un cuero en la etici&n de forma fleible / multivariada!
• "a ?nica tabla 'ue (a/ ara sincroni%ar es contacto!
• Enviaré las inserciones, modificaciones / eliminaciones!
• saré un ob#eto JS67 con G arre*los 'ue reresenten las oeraciones mencionadas arriba! $l*o como9
• >
• 5%nserc%ones5BJ
• 66
• K+
• 5,od%/%cac%ones5BJ
• 66
• K+
• 5el%,%nac%ones5BJ
• 66
• K
Eisten muc(as maneras de reali%ar un batc( en una etici&n, / de se*uro ver)s unas mu/ in*eniosas 'ue usan los ar)metros de lasR"s o incluso las cabeceras BTT<! ncluso la combinaci&n de varias eticiones BTT< en una sola!
<ero como siemre di*o, las r)cticas variar)n se*?n tus necesidades / estilo de ro*ramaci&n!
Heamos como formar el scrit <(!
a'! En rimer lu*ar crea un método llamado post$* ara tratar la etici&n! $(ora iensa un oco en el al*oritmo a se*uir ara traducirla a/load!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 16/113
#Cu3l ser%a el orden)
Heamos9
1! $utori%ar el usuario2! Etraer el cuero JS67 del contenido de la etici&n <6STG! -ecodificar el ob#eto en un arra/ asociativoI! $licar oeraciones en batc( descritas en el arra/
+omo ves, lo ?nico 'ue no (e elicado antes es reali%ar las oeraciones en batc(, ero las rimeras acciones /a sabes alicarlas! El batc( lo imlementaremos en un método or searada llamado apl%caratc$*, el cual recibe el mensa#e decodificado / el id delusuario!
publ%c stat%c /unct%on post$<se,entos*
> <%dUsuar%o 2 usuar%osBBautor%ar$*4
<,ensaePlano 2 /%le_et_contents$'ppB77%nput'*4
<,ensaeDecod%/%cado 2 son_decode$<,ensaePlano+ PDOBB"ETC3_ASSOC*4
%/ $e,pt8$<,ensaeDecod%/%cado** > sel/BBapl%caratc$<,ensaeDecod%/%cado+ <%dUsuar%o*4 77 Contru%r respuesta <respuestaJ'estado'K 2 sel/BBESTADO_E#ITO4 <respuestaJ',ensae'K 2 ut/_encode$sel/BBMENSAE_0..*4
ttp_response_code$(..*4 else > 77 Respuesta error tro ne E=cepc%onAp%$sel/BBESTADO_MA!A_SINTA#IS+ sel/BBMENSAE_0.+ ((*4
return <respuesta4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 17/113
b'! El método apl%caratc$* abre una transacci&n de bases de datos ara comen%ar a alicar inserciones, modificaciones /eliminaciones de los contactos! na ve% todo se (a llevado a cambio, la transacci&n termina / se confirman los cambios remotos!
"a alicaci&n de cada oeraci&n se lleva a cabo con unos nuevos métodos de la clase contactos 'ue veremos en el si*uiente aso9
pr%&ate /unct%on apl%caratc$<pa8load+ <%dUsuar%o*> <pdo 2 Cone=%onDBBobtenerInstanc%a$*-FobtenerD$*4
7? ? Ver%/%cac%nB Con/%r,ar ;ue e=%ste al ,enos un t%po de operac%n ?7 %/ $%sset$<pa8loadJsel/BBINSERCIONESK* WW %sset$<pa8loadJsel/BBMODI"ICACIONESK* WW %sset$<pa8loadJsel/BBE!IMINACIONESK* * > tro ne E=cepc%onAp%$sel/BBESTADO_MA!A_SINTA#IS+ sel/BBMENSAE_0.+ ((*4
tr8 >
77 Co,enar transacc%n <pdo-Fbe%nTransact%on$*4
77 Inserc%ones %/ $%sset$<pa8loadJsel/BBINSERCIONESK** contactosBB%nsertarEnatc$<pdo+ <pa8loadJsel/BBINSERCIONESK+ <%dUsuar%o*4 77 Mod%/%cac%ones
%/ $%sset$<pa8loadJsel/BBMODI"ICACIONESK** contactosBB,od%/%carEnatc$<pdo+ <pa8loadJsel/BBMODI"ICACIONESK+ <%dUsuar%o*4 77 El%,%nac%ones %/ $%sset$<pa8loadJsel/BBE!IMINACIONESK** > contactosBBel%,%narEnatc$<pdo+ <pa8loadJsel/BBE!IMINACIONESK+ <%dUsuar%o*4
77 Con/%r,ar ca,b%os <pdo-Fco,,%t$*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 18/113
catc $PDOE=cept%on <e* > tro ne E=cepc%onAp%$<pdo-FerrorCode$*+ <e-FetMessae$*+ ((*4
6bserva 'ue /o comien%o a llamar los ob#etos '%nserc%ones', ',od%/%cac%ones' e '%nserc%ones' directamente desde pa8load!Esto lo (a*o or'ue ten*o solo la tabla contactos! <ero si (a/ m)s de una, debes crear un ciclo /or o /oreac ara rocesar la lista detablas!
-onde el cuero de la etici&n vendría con la si*uiente sintais9
> 5tabla05B> 5%nserc%ones5BJ
K+ 5,od%/%cac%ones5BJ
K+ 5el%,%nac%ones5BJ
K + 5tabla(5B> 5%nserc%ones5BJ
K+ 5,od%/%cac%ones5BJ
K+ 5el%,%nac%ones5BJ
K + 666+ 5tablan5B>
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 19/113
5%nserc%ones5BJ
K+ 5,od%/%cac%ones5BJ
K+ 5el%,%nac%ones5BJ
K
+ada recurso a tratar en batc( debe tener sus resectivos métodos %nsertarEnatc$*, ,od%/%carEnatc$* /el%,%narEnatc$*! $sí odr)s *enerali%ar la llamada de los métodos dentro del /or, ara evitar (acer referencia a cada nombredentro del ciclo!
c'! El si*uiente aso es escribir el método %nsertarEnatc$* en contactos!p7p! Este tio de métodos se caracteri%a or usar un bucle ara rocesar cada comando de la base de datos! En este caso la sentencia INSERT en /s'l!
"a idea es leer todos los elementos del arra/ '%nserc%ones' / e#ecutar una sentencia rearada con los datos de cada ítem!
"as inserciones de contactos tienen la si*uiente forma en el cuero JS679
5%nserc%ones5BJ > 5%dContacto5B5&05+
5pr%,erNo,bre5B5&(5+ 5pr%,erApell%do5B5&5+ 5tele/ono5B5&5+ 5correo5B5&)5+ 5&ers%on5B5&X5 + > 666 + 666+
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 20/113
> 666 K
En cada iteraci&n del ciclo 'ue rocesa las inserciones maearemos la sentencia S" con los nombres 'ue vemos en el re*istro dee#emlo anterior de la si*uiente forma9
Dentro de contactos.php
publ%c stat%c /unct%on %nsertarEnatc$PDO <pdo+ <l%staContactos+ <%dUsuar%o*> 77 Sentenc%a INSERT <co,ando 2 'INSERT INTO ' 6 sel/BBTA!A_CONTACTO 6 ' $ ' 6 sel/BBID_CONTACTO 6 '+' 6
sel/BBPRIMER_NOMRE 6 '+' 6 sel/BBPRIMER_APE!!IDO 6 '+' 6 sel/BBTE!E"ONO 6 '+' 6 sel/BBCORREO 6 '+' 6 sel/BBID_USUARIO 6 '+' 6 sel/BBVERSION 6 '*' 6 ' VA!UES$:+:+:+:+:+:+:*'4
77 Preparar la sentenc%a <sentenc%a 2 <pdo-Fprepare$<co,ando*4
<sentenc%a-Fb%ndPara,$0+ <%dContacto*4 <sentenc%a-Fb%ndPara,$(+ <pr%,erNo,bre*4 <sentenc%a-Fb%ndPara,$+ <pr%,erApell%do*4 <sentenc%a-Fb%ndPara,$+ <tele/ono*4 <sentenc%a-Fb%ndPara,$)+ <correo*4 <sentenc%a-Fb%ndPara,$X+ <%dUsuar%o*4 <sentenc%a-Fb%ndPara,$+ <&ers%on*4
/oreac $<l%staContactos as <%te,* > <%dContacto 2 <%te,Jsel/BBID_CONTACTOK4 <pr%,erNo,bre 2 <%te,Jsel/BBPRIMER_NOMREK4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 21/113
<pr%,erApell%do 2 <%te,Jsel/BBPRIMER_APE!!IDOK4 <tele/ono 2 <%te,Jsel/BBTE!E"ONOK4 <correo 2 <%te,Jsel/BBCORREOK4 <&ers%on 2 <%te,Jsel/BBVERSIONK4 <sentenc%a-Fe=ecute$*4
d'! -e la misma manera rocesamos las modificaciones, /a 'ue el contenido del arra/ JS67 ',od%/%cac%ones' viene confi*urado deforma similar!
5,od%/%cac%ones5BJ > 5%dContacto5B5&05+
5pr%,erNo,bre5B5&(5+ 5pr%,erApell%do5B5&5+ 5tele/ono5B5&5+ 5correo5B5&)5+ 5&ers%on5B5&X5 + > 666 + 666+ > 666
K
Esta ve% usa la sentencia UPDATE con lace(olders en los valores nuevos / li*a los ar)metros 'ue vienen desde el cliente!
publ%c stat%c /unct%on ,od%/%carEnatc$PDO <pdo+ <arra8Contactos+ <%dUsuar%o*>
77 Preparar operac%n de ,od%/%cac%n para cada contacto
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 22/113
<co,ando 2 'UPDATE ' 6 sel/BBTA!A_CONTACTO 6 ' SET ' 6 sel/BBPRIMER_NOMRE 6 '2:+' 6 sel/BBPRIMER_APE!!IDO 6 '2:+' 6 sel/BBTE!E"ONO 6 '2:+' 6 sel/BBCORREO 6 '2:+' 6 sel/BBVERSION 6 '2: ' 6 ' 3ERE ' 6 sel/BBID_CONTACTO 6 '2: AND ' 6 sel/BBID_USUARIO 6 '2:'4
77 Preparar la sentenc%a update <sentenc%a 2 <pdo-Fprepare$<co,ando*4
77 !%ar para,etros <sentenc%a-Fb%ndPara,$0+ <pr%,erNo,bre*4 <sentenc%a-Fb%ndPara,$(+ <pr%,erApell%do*4 <sentenc%a-Fb%ndPara,$+ <tele/ono*4 <sentenc%a-Fb%ndPara,$+ <correo*4 <sentenc%a-Fb%ndPara,$)+ <&ers%on*4
<sentenc%a-Fb%ndPara,$X+ <%dContacto*4 <sentenc%a-Fb%ndPara,$+ <%dUsuar%o*4
77 Procesar arra8 de contactos /oreac $<arra8Contactos as <contacto* > <%dContacto 2 <contactoJsel/BBID_CONTACTOK4 <pr%,erNo,bre 2 <contactoJsel/BBPRIMER_NOMREK4 <pr%,erApell%do 2 <contactoJsel/BBPRIMER_APE!!IDOK4 <tele/ono 2 <contactoJsel/BBTE!E"ONOK4 <correo 2 <contactoJsel/BBCORREOK4 <&ers%on 2 <contactoJsel/BBVERSIONK4 <sentenc%a-Fe=ecute$*4
e'! En cuanto a las eliminaciones el asunto es muc(o m)s sencillo! Solo recibir)s los identificadores de a'uellos contactos a eliminar, or lo 'ue tendremos un arre*lo sencillo de strin*s como el si*uiente9
5el%,%nac%ones5BJ 5C-)bX.dc-X..-Q.-Qb-Q(d0QcaX5+
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 23/113
5C-/bcX-a0-))-abc-aXd0).da5+ 666+ 5C-X()dQdd-Q(a.-.X-bd/Q-QXac(5K
Esto solo nos de#a iterar sobre una sentencia rearada basada en un DE!ETE con dos lace(olders! no ara el identificador delcontacto / otro ara el del usuario!
publ%c stat%c /unct%on el%,%narEnatc$PDO <pdo+ <arra8Ids+ <%dUsuar%o*> 77 Crear sentenc%a DE!ETE <co,ando 2 'DE!ETE "ROM ' 6 sel/BBTA!A_CONTACTO 6 ' 3ERE ' 6 sel/BBID_CONTACTO 6 ' 2 : AND ' 6 sel/BBID_USUARIO 6 '2:'4
77 Preparar sentenc%a en el contenedor <sentenc%a 2 <pdo-Fprepare$<co,ando*4
77 Procesar todas las %ds /oreac $<arra8Ids as <%d* > <sentenc%a-Fe=ecute$arra8$<%d+ <%dUsuar%o**4
+on todas las modificaciones anteriores el servicio web REST 'ueda rearado ara obtener todos los datos a sincroni%ar / aramodificar con un solo envi&n!
$(ora solo 'ueda crear la a $ndroid ara robar estas características!
#;! Desarollo De /a Aplicación Android
;! Crear nuevo pro2ecto en Android Studio
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 24/113
Paso #! $bre $ndroid Studio, ve a <ile =e, =e, Pro>ect? / así*nale el nombre de 4eopleApp5! +onfirma las características /al final a.ade una actividad en blanco C1lan@ Activit2D ara tener un avance de la lista de contactos!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 25/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 26/113
Paso #-! Eli*e los es'uemas de colores ara el aterial -esi*n! En el wireframin* vimos 'ue tendremos como aleta rincial con unde*radado de a%ul / una aleta secundaria con rosa ara los acentos!
<ara obtener estos colores 'uiero mostrarte una utilidad web 'ue me (a arecido s?er interesante! Su nombre es aterial -esi*n+olors! Esta (erramienta te ermite ele*ir los de*radados de los colores 'ue deseas usar en tu a! ncluso te de#a ver la revisuali%aci&n de sus combinaciones!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 27/113
"a anterior ima*en muestra los colores definidos de la si*uiente forma9
• <rimario oscuro9 a%ul K00
• <rimario 9 a%ul 500
• Realces 9 a%ul 100
• $cento 9 Rosa I00
+on la (erramienta “Palette Creator” 'ue se muestra al costado derec(o se ver) el resultado de esta forma9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 28/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 29/113
$(ora solo debes coiar los colores ele*idos en tu arc(ivo valuescolors!:ml como se ve en el si*uiente c&di*o9
colors.xml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9resourcesF 9-- Paleta Y0 --F 9color na,e25aul..5FY0QXD(97colorF 9color na,e25aul)..5FY(0QX"97colorF 9color na,e25aul0..5FYDE"97colorF
9-- Paleta Y( --F 9color na,e25rosa)..5FYEC.A97colorF
97resourcesF
Paso #0! +rea los strin*s a usar en la interfa%! $bre tu arc(ivo valuesstrins!:ml / a.ade las si*uientes cadenas!
strings.xml
9resourcesF 9-- No,bre App --F 9str%n na,e25app_na,e5FPeople App97str%nF
9-- T%tulos act%&%dades --F 9str%n na,e25t%tulo_act%&%dad_act%&%dad_contactos5FContactos97str%nF 9str%n na,e25t%tulo_act%&%dad_%nsertar_contacto5FA@ad%r nue&o contacto97str%nF
9str%n na,e25t%tulo_act%&%dad_ed%tar_contacto5FEd%tar contacto97str%nF
9-- "or,ular%o Act%&%dad %nserc%n --F 9str%n na,e25%nt_ca,po_te=to_no,bre5FPr%,er no,bre97str%nF 9str%n na,e25%nt_ca,po_te=to_apell%do5FPr%,er apell%do97str%nF 9str%n na,e25%nt_ca,po_te=to_tele/ono5FTelH/ono97str%nF 9str%n na,e25%nt_ca,po_te=to_correo5FCorreo97str%nF
9-- Toolt%ps acc%ones toolbar --F
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 30/113
9str%n na,e25acc%on_s8nc5FS%ncron%ar97str%nF 9str%n na,e25acc%on_el%,%nar5FEl%,%nar97str%nF 9str%n na,e25acc%on_uardar5F1uardar97str%nF 9str%n na,e25acc%on_descartar5FDescartar97str%nF
9-- Cuenta S8nc Adapter --F 9str%n na,e25t%po_cuenta5Fco,6erprora,ac%on6peopleapp6cuenta97str%nF
9-- Autor%dad del pro&%der --F 9str%n na,e25autor%dad_pro&%der5Fco,6erprora,ac%on6peopleapp97str%nF
97resourcesF
$l inicio tenemos el nombre de todas las antallas 'ue usaremos ara tratar los contactos! "ue*o los tetos emer*entes ara lasacciones de la toolbar!
$l final del arc(ivo también tenemos el tio de cuenta 'ue usaremos en el s/nc adater ara la sincroni%aci&n / la autoridad delcontent rovider!
Paso #5! $*re*a los colores al tema central! $(ora es turno de modificar los estilos 'ue $ndroid Studio nos (a creado or defecto! Eneste caso asi*naremos los colores 'ue creamos en el tema base de la si*uiente forma9
values/styles.xml
9resourcesF
9-- Te,a ase --F 9st8le na,e25AppTe,e5 parent25Te,e6AppCo,pat6!%t6DarZAct%onar5F 9-- Custo,%e 8our te,e ere6 --F 9%te, na,e25colorPr%,ar85Fcolor7aul)..97%te,F 9%te, na,e25colorPr%,ar8DarZ5Fcolor7aul..97%te,F 9%te, na,e25colorAccent5Fcolor7rosa)..97%te,F
9%te, na,e25%ndoAct%onar5F/alse97%te,F 9%te, na,e25%ndoNoT%tle5Ftrue97%te,F 97st8leF
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 31/113
9st8le na,e25AppTe,e6NoAct%onar5F 9%te, na,e25%ndoAct%onar5F/alse97%te,F 9%te, na,e25%ndoNoT%tle5Ftrue97%te,F 97st8leF
9st8le na,e25AppTe,e6ApparO&erla85 parent25Te,eO&erla86AppCo,pat6DarZ6Act%onar5 7F 9st8le na,e25AppTe,e6PopupO&erla85 parent25Te,eO&erla86AppCo,pat6!%t5 7F
97resourcesF
Paso #;! $*re*a todas las librerías necesarias ara la interfa%, las coneiones de Red / arsin* JS67! "a confi*uraci&n arcial del ro/ecto la termino a.adiendo al arc(ivo build!radle las librerías necesarias ara desarrollar la a!
Entre estas tenemos la librería de dise.o ara usar .abs buttons, snac@ bars, app bars, etc! También el rec2cler vie, ara la lista decontactos! "a versi&n no oficial de volle2 ara eticiones BTT< / Bson ara el arsin* JS67!
build.gradle
dependenc%es > co,p%le /%leTree$%ncludeB J'?6ar'K+ d%rB 'l%bs'* testCo,p%le 'un%tBun%tB60(' co,p%le 'co,6andro%d6supportBappco,pat-&B(6060' co,p%le 'co,6andro%d6supportBdes%nB(6060' co,p%le 'co,6andro%d6supportBrec8cler&%e-&B(6060' co,p%le 'co,6,c=%aoZe6&olle8Bl%brar8B06.60Q' co,p%le 'co,6oole6code6sonBsonB(6'
Paso #! $bre tu arc(ivo valuesdimens!:ml / coia el si*uiente c&di*o si deseas tener las mismas roorciones 'ue usaré en la 9
dimens.xml
9resourcesF 9-- De/ault screen ,ar%ns+ per te Andro%d Des%n u%del%nes6 --F
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 32/113
9d%,en na,e25act%&%t8_or%ontal_,ar%n5F0Xdp97d%,enF 9d%,en na,e25act%&%t8_&ert%cal_,ar%n5F0Xdp97d%,enF
9d%,en na,e25,arenes_/ab5F0Xdp97d%,enF
9-- !%stas --F 9d%,en na,e25altura_%te,_l%sta_s%,ple5Fdp97d%,enF 9d%,en na,e25ta,ano_te=to_%te,_l%sta5F0Xsp97d%,enF 9d%,en na,e25padd%n_or%ontal_%te,_l%sta5F0Xdp97d%,enF 9d%,en na,e25padd%n_super%or_%te,_l%sta5Fdp97d%,enF97resourcesF
;!- Crear lista de contactos
"a creaci&n de la lista de contactos imlica varios comonentes 'ue relacionan la vista con el modelo de datos / a su ve% entre*an elmane#o al usuario!
<ara simlificar las tareas de desarrollo 'ue reali%aré a.adiré el si*uiente dia*rama con los elementos 'ue necesitaré! "os comonentesdel tono amarillo ertenecen al modelo, los de tono naran#a a la vista / los de tono ro#o nos roorcionan controladores de eventos9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 33/113
+omo ves, detr)s del refle#o de la lista se encuentran una *ran cantidad de comonentes 'ue soortan su funcionamiento! El lado bueno es 'ue cada uno de estos /a los (emos estudiado en varios de los artículos asados, así 'ue no (a/ nada de 'ué reocuarse!
Teniendo en cuenta esta ar'uitectura, comen%aremos or desarrollar los comonentes del modelo!
Paso #! +rea el contrato ara la base de datos! $.ade una nueva clase Java llamada +ontrato / a.ade el si*uiente c&di*o9
Contrato.java
publ%c class Contrato >
%nter/ace Colu,nasS%ncron%ac%on > Str%n MODI"ICADO 2 5,od%/%cado54
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 34/113
Str%n E!IMINADO 2 5el%,%nado54 Str%n INSERTADO 2 5%nsertado54
%nter/ace Colu,nasContacto >
Str%n ID_CONTACTO 2 5%dContacto54 77 PZ Str%n PRIMER_NOMRE 2 5pr%,erNo,bre54 Str%n PRIMER_APE!!IDO 2 5pr%,erApell%do54 Str%n TE!E"ONO 2 5tele/ono54 Str%n CORREO 2 5correo54 Str%n VERSION 2 5&ers%on54
77 Autor%dad del Content Pro&%der publ%c /%nal stat%c Str%n AUTORIDAD 2 5co,6erprora,ac%on6peopleapp54
77 Ur% base publ%c /%nal stat%c Ur% URI_CONTENIDO_ASE 2 Ur%6parse$5contentB775 [ AUTORIDAD*4
7?? ? Controlador de la tabla 5contacto5 ?7 publ%c stat%c class Contactos %,ple,ents aseColu,ns+ Colu,nasContacto+ Colu,nasS%ncron%ac%on >
publ%c stat%c /%nal Ur% URI_CONTENIDO 2 URI_CONTENIDO_ASE6bu%ldUpon$*6appendPat$RECURSO_CONTACTO*6bu%ld$*4
publ%c /%nal stat%c Str%n MIME_RECURSO 2 5&nd6andro%d6cursor6%te,7&nd65 [ AUTORIDAD [ 575 [ RECURSO_CONTACTO4
publ%c /%nal stat%c Str%n MIME_CO!ECCION 2 5&nd6andro%d6cursor6d%r7&nd65 [ AUTORIDAD [ 575 [ RECURSO_CONTACTO4
7??
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 35/113
? Constru8e una >l%nZ Ur% para el >l%nZ YID_CONTACTO sol%c%tado6 ?7 publ%c stat%c Ur% constru%rUr%Contacto$Str%n %dContacto* > return URI_CONTENIDO6bu%ldUpon$*6appendPat$%dContacto*6bu%ld$*4
publ%c stat%c Str%n enerarIdContacto$* > return 5C-5 [ UUID6rando,UUID$*4
publ%c stat%c Str%n obtenerIdContacto$Ur% ur%* > return ur%6et!astPatSe,ent$*4
77 Recursos publ%c /%nal stat%c Str%n RECURSO_CONTACTO 2 5contactos54
En rimera instancia tenemos dos interfaces con los nombres de las columnas 'ue eistir)n en la tabla contacto!Colu,nasS%ncron%ac%on contiene tres banderas ara determinar si los re*istros locales (an sido insertados, modificados oeliminados! -onde el valor 0 determina el al%a de la bandera / . la ausencia de cambio!
$ su ve% defino la autoridad del content rovider con mi a'uete #ava / de una ve% la uri de contenido *eneral!
$l final tendremos una clase controladora ara el recurso “contactos”! Su ob#etivo es roorcionar informaci&n sobre la uri de
contenido, los tios mime / la construcci&n de uris ara soortar identificadores!
$dicionalmente tiene un método llamado enerarIdContacto$*, el cual se encar*a de crear una nueva id ara los nuevos contactoslocales, basada en la sintais 3C(UU9D4! -onde - es un identificador ?nico de 1L b/tes obtenido con la clase UUID!
2uestra6 4C7/8fbab17fe078edf790a87e/ff/0faf5
Si est)s erdido en este unto, entonces te recomiendo leer mi artículo ara crear un content rovider ersonali%ado!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 36/113
Paso #-! +rea la clase auiliar ara el acceso a bases de datos! En este aso debes crear una nueva clase 'ue etienda deS\!%teOpen3elper / sobrescribir los controladores onCreate$* / onUprade$* ara determinar las acciones al crear la base de datos/ al actuali%ar su versi&n!
HelperContactos.java
publ%c class 3elperContactos e=tends S\!%teOpen3elper >
stat%c /%nal %nt VERSION 2 04
stat%c /%nal Str%n NOMRE_D 2 5people_app6db54
%nter/ace Tablas > Str%n CONTACTO 2 5contacto54
publ%c 3elperContactos$Conte=t conte=t* > super$conte=t+ NOMRE_D+ null+ VERSION*4
O&err%de publ%c &o%d onCreate$S\!%teDatabase db* > db6e=ecS\!$ 5CREATE TA!E 5 [ Tablas6CONTACTO [ 5$5 [ Contactos6_ID [ 5 INTE1ER PRIMAR] LE] AUTOINCREMENT+5 [ Contactos6ID_CONTACTO [ 5 TE#T UNI\UE+5 [ Contactos6PRIMER_NOMRE [ 5 TE#T NOT NU!!+5
[ Contactos6PRIMER_APE!!IDO [ 5 TE#T+5 [ Contactos6TE!E"ONO [ 5 TE#T+5 [ Contactos6CORREO [ 5 TE#T+5 [ Contactos6VERSION [ 5 DATE DE"AU!T CURRENT_TIMESTAMP+5 [ Contactos6INSERTADO [ 5 INTE1ER DE"AU!T 0+5 [ Contactos6MODI"ICADO [ 5 INTE1ER DE"AU!T .+5 [ Contactos6E!IMINADO [ 5 INTE1ER DE"AU!T .*5*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 37/113
O&err%de publ%c &o%d onUprade$S\!%teDatabase db+ %nt %+ %nt %0* > tr8 > db6e=ecS\!$5DROP TA!E I" E#ISTS 5 [ Tablas6CONTACTO*4
catc $S\!%teE=cept%on e* > 77 Maneo de e=cepc%ones onCreate$db*4
Recuerda incluir siemre la columna 5_%d5 manualmente o su e'uivalente en aseColu,ns6_ID! El frameworM de $ndroid lo necesitaen varios comonentes ara un correcto funcionamiento!
Es imortante 'ue a.adas un índice UNI\UE a la columna %dContacto ara establecer restricciones de unicidad entre los contactos con
base a la base de datos /s'l!
En cuanto a las columnas de sincroni%aci&n, declara valores or defecto con DE"AU!T ara de#arlas inactivas al crear un nuevo re*istro!5%nsertado5 uedes de#arla levantada or defecto, /a 'ue una inserci&n local rovoca este estado! Sin embar*o, cuando la inserci&nven*a or roducto de la sincroni%aci&n, cambia el valor a . en la sentencia INSERT!
Si tienes dudas sobre la creaci&n de bases de datos S"ite, entonces lee mi artículo Tutorial -e ;ases -e -atos S"ite En $ndroid!
Paso #0! +rea un +ontent <rovider ersonali%ado ara oerar los datos a través de Rs!
<ara la tabla contactos tenemos dos formas de R a la cual referimos deendiendo si nos referimos a todos los re*istros Ccolecci&nD oa un contacto esecífico CrecursoD!
contentB77co,6erprora,ac%on6peopleapp7contactoscontentB77co,6erprora,ac%on6peopleapp7contactos7B%d
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 38/113
<ara diferenciar estas dos estructuras recuerda 'ue la clase Ur%Matcer rovee la asociaci&n de c&di*os ?nicos con atrones de uris!$sí 'ue si te basas en este comonente, la sobrescritura de los métodos ;uer8$*, %nsert$*, update$*, delete$*, bulZInsert$* oappl8atc$*!
Teniendo en cuenta estas recomendaciones, /a uedes crear el content rovider!
na de las formas de (acerlo es a través de la lantilla de $ndroid Studio al resionar clicM derec(o en el a'uete / ele*ir =e, 6t7er Content Provider! +on ello no tendr)s 'ue a.adir la declaraci&n del comonente en el Android)ani.est!:ml!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 39/113
El nombre del arc(ivo ser) ProviderContactos!>ava! na ve% 'ue ten*as la lantilla, a*re*a la si*uiente definici&n de loscontroladores9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 40/113
ProviderContactos.java
7?? ? >l%nZ ContentPro&%der ;ue encapsula el acceso a la base de datos de contactos
?7publ%c class Pro&%derContactos e=tends ContentPro&%der >
77 Co,parador de URIs de conten%do publ%c stat%c /%nal Ur%Matcer ur%Matcer4
77 Ident%/%cadores de t%pos publ%c stat%c /%nal %nt CONTACTOS 2 0..4 publ%c stat%c /%nal %nt CONTACTOS_ID 2 0.04
stat%c > ur%Matcer 2 ne Ur%Matcer$Ur%Matcer6NO_MATC3*4 ur%Matcer6addURI$Contrato6AUTORIDAD+ 5contactos5+ CONTACTOS*4 ur%Matcer6addURI$Contrato6AUTORIDAD+ 5contactos7?5+ CONTACTOS_ID*4
pr%&ate 3elperContactos ,aneadorD4 pr%&ate ContentResol&er resol&er4
O&err%de publ%c boolean onCreate$* > ,aneadorD 2 ne 3elperContactos$etConte=t$**4 resol&er 2 etConte=t$*6etContentResol&er$*4 return true4
O&err%de publ%c Str%n etT8pe$Ur% ur%* > s%tc $ur%Matcer6,atc$ur%** > case CONTACTOSB return Contactos6MIME_CO!ECCION4 case CONTACTOS_IDB return Contactos6MIME_RECURSO4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 41/113
de/aultB tro ne IllealAru,entE=cept%on$5T%po desconoc%doB 5 [ ur%*4
O&err%de publ%c Cursor ;uer8$Ur% ur%+ Str%nJK proect%on+ Str%n select%on+ Str%nJK select%onArs+ Str%n sortOrder* > 77 Obtener base de datos S\!%teDatabase db 2 ,aneadorD6etr%tableDatabase$*4 77 Co,parar Ur% %nt ,atc 2 ur%Matcer6,atc$ur%*4
Cursor c4
s%tc $,atc* > case CONTACTOSB
77 Consultando todos los re%stros c 2 db6;uer8$Tablas6CONTACTO+ proect%on+ select%on+ select%onArs+ null+ null+ sortOrder*4 c6setNot%/%cat%onUr%$resol&er+ Contactos6URI_CONTENIDO*4 breaZ4 case CONTACTOS_IDB 77 Consultando un solo re%stro basado en el Id del Ur% Str%n %dContacto 2 Contactos6obtenerIdContacto$ur%*4 c 2 db6;uer8$Tablas6CONTACTO+ proect%on+ Contactos6ID_CONTACTO [ 525 [ 5^'5 [ %dContacto [ 5^'5 [ $Te=tUt%ls6%sE,pt8$select%on* :
5 AND $5 [ select%on [ '*' B 55*+ select%onArs+ null+ null+ sortOrder*4 c6setNot%/%cat%onUr%$resol&er+ ur%*4 breaZ4 de/aultB tro ne IllealAru,entE=cept%on$5URI no soportadaB 5 [ ur%*4 return c4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 42/113
O&err%de publ%c %nt delete$Ur% ur%+ Str%n select%on+ Str%nJK select%onArs* > S\!%teDatabase db 2 ,aneadorD6etr%tableDatabase$*4
%nt ,atc 2 ur%Matcer6,atc$ur%*4 %nt /%lasA/ectadas4
s%tc $,atc* > case CONTACTOSB
/%lasA/ectadas 2 db6delete$Tablas6CONTACTO+ select%on+ select%onArs*4
resol&er6not%/8Cane$ur%+ null+ /alse*4
breaZ4 case CONTACTOS_IDB
Str%n %dContacto 2 Contactos6obtenerIdContacto$ur%*4
/%lasA/ectadas 2 db6delete$Tablas6CONTACTO+ Contactos6ID_CONTACTO [ 525 [ 5^'5 [ %dContacto [ 5^'5 [ $Te=tUt%ls6%sE,pt8$select%on* : 5 AND $5 [ select%on [ '*' B 55*+ select%onArs*4
resol&er6not%/8Cane$ur%+ null+ /alse*4
breaZ4 de/aultB tro ne IllealAru,entE=cept%on$5Contacto desconoc%doB 5 [ ur%*4 return /%lasA/ectadas4
O&err%de
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 43/113
publ%c Ur% %nsert$Ur% ur%+ ContentValues &alues* > 77 Val%dar la ur% %/ $ur%Matcer6,atc$ur%* 2 CONTACTOS* > tro ne IllealAru,entE=cept%on$5URI desconoc%da B 5 [ ur%*4
ContentValues contentValues4 %/ $&alues 2 null* > contentValues 2 ne ContentValues$&alues*4 else > contentValues 2 ne ContentValues$*4
77 Inserc%n de nue&a /%la S\!%teDatabase db 2 ,aneadorD6etr%tableDatabase$*4
lon _%d 2 db6%nsert$Tablas6CONTACTO+ null+ contentValues*4
%/ $_%d F .* >
resol&er6not%/8Cane$ur%+ null+ /alse*4
Str%n %dContacto 2 contentValues6etAsStr%n$Contactos6ID_CONTACTO*4
return Contactos6constru%rUr%Contacto$%dContacto*4 tro ne S\!E=cept%on$5"alla al %nsertar /%la en B 5 [ ur%*4
O&err%de publ%c %nt update$Ur% ur%+ ContentValues &alues+ Str%n select%on+ Str%nJK select%onArs* >
S\!%teDatabase db 2 ,aneadorD6etr%tableDatabase$*4
%nt /%lasA/ectadas4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 44/113
s%tc $ur%Matcer6,atc$ur%** > case CONTACTOSB
/%lasA/ectadas 2 db6update$Tablas6CONTACTO+ &alues+ select%on+ select%onArs*4
resol&er6not%/8Cane$ur%+ null+ /alse*4
breaZ4 case CONTACTOS_IDB
Str%n %dContacto 2 Contactos6obtenerIdContacto$ur%*4
/%lasA/ectadas 2 db6update$Tablas6CONTACTO+ &alues+ Contactos6ID_CONTACTO [ 525 [ 5^'5 [ %dContacto [ 5^'5 [ $Te=tUt%ls6%sE,pt8$select%on* : 5 AND $5 [ select%on [ '*' B 55*+
select%onArs*4
resol&er6not%/8Cane$ur%+ null+ /alse*4
breaZ4 de/aultB tro ne IllealAru,entE=cept%on$5URI desconoc%daB 5 [ ur%*4
return /%lasA/ectadas4
untos a resaltar6
• El c&di*o ara un acceso a todos los contactos es 0.. / el de accesos individuales es 0.0!
• "lama el método not%/8Cane$* del ContentResol&er ara alertar al frameworM 'ue el contenido de cada uri cambi&!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 45/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 46/113
9andro%d6support6des%n6%det6"loat%nAct%onutton andro%dB%d25[%d7/ab5 andro%dBla8out_%dt25rap_content5 andro%dBla8out_e%t25rap_content5 andro%dBla8out_ra&%t825botto,end5
andro%dBla8out_,ar%n25d%,en7,arenes_/ab5 andro%dBsrc25draable7%cono_nue&o_contacto5 7F
97andro%d6support6des%n6%det6Coord%nator!a8outF
"a eti'ueta 9%ncludeF la est) *enerando $ndroid Studio ara etraer el contenido rincial de la actividad en otro la/outcomlementario, 'ue ermite me#orar la visuali%aci&n / el orden!
El la/out *eneral lo de#aremos 'uieto! Solo modifica el icono del fab button con un icono de a.adir contacto! <ara descar*arlo uedesir a la (erramienta aterial -esi*n cons / resionar 9con Pac@ae Android ;!:!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 47/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 48/113
contenido_actividad_lista_contactos.xml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9andro%d6support6&6%det6Rec8clerV%e =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 =,lnsBapp25ttpB77sce,as6andro%d6co,7apZ7res-auto5 andro%dB%d25[%d7rec%clador5 andro%dBla8out_%dt25,atc_parent5 andro%dBla8out_e%t25,atc_parent5 andro%dBpadd%nTop25d%,en7padd%n_super%or_%te,_l%sta5 appBla8out_bea&%or25str%n7appbar_scroll%n_&%e_bea&%or5 7F
Paso #;! $.adir adatador ersonali%ado con soorte de cursor! El rec/cler ser) oblado or los datos 'ue ten*amos en la tablacontacto, or ende es necesario usar un cursor al adatador 'ue creemos!
El adatador debes construirlo de la misma en 'ue (aces siemre, es decir, sobrescribiendo los métodos etIte,Count$*,
onCreateV%e3older$* / on%ndV%e3older$*! Solo 'ue esta ve% el contenido ser) una instancia tio +ursor, or lo 'ue debes usarlos métodos del cursor ara obtener los datos / li*arlos a la interfa%!
:eamos6
AdaptadorContactos.java
7?? ? Adaptador para la l%sta de contactos ?7publ%c class AdaptadorContactos e=tends Rec8clerV%e6Adapter9AdaptadorContactos6V%e3olderF >
pr%&ate Cursor %te,s4
77 Instanc%a de escuca pr%&ate OnIte,Cl%cZ!%stener escuca4
7?? ? Inter/a para escucar cl%cZs del rec8cler ?7 %nter/ace OnIte,Cl%cZ!%stener >
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 49/113
publ%c &o%d onCl%cZ$V%e3older older+ Str%n %dContacto*4
publ%c class V%e3older e=tends Rec8clerV%e6V%e3older %,ple,ents V%e6OnCl%cZ!%stener >
77 Ca,pos respect%&os de un %te, publ%c Te=tV%e no,bre4
publ%c V%e3older$V%e &* > super$&*4 no,bre 2 $Te=tV%e* &6/%ndV%e8Id$R6%d6no,bre_contacto*4 &6setOnCl%cZ!%stener$t%s*4
O&err%de publ%c &o%d onCl%cZ$V%e &%e* > escuca6onCl%cZ$t%s+ obtenerIdContacto$etAdapterPos%t%on$***4
pr%&ate Str%n obtenerIdContacto$%nt pos%c%on* >
%/ $%te,s 2 null* > %/ $%te,s6,o&eToPos%t%on$pos%c%on** > return UConsultas6obtenerStr%n$%te,s+ Contactos6ID_CONTACTO*4 else > return null4 else > return null4
publ%c AdaptadorContactos$OnIte,Cl%cZ!%stener escuca* > t%s6escuca 2 escuca4
O&err%de
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 50/113
publ%c V%e3older onCreateV%e3older$V%e1roup parent+ %nt &%eT8pe* > V%e & 2 !a8outIn/later6/ro,$parent6etConte=t$** 6%n/late$R6la8out6%te,_contacto+ parent+ /alse*4 return ne V%e3older$&*4
O&err%de publ%c &o%d on%ndV%e3older$V%e3older older+ %nt pos%t%on* >
%te,s6,o&eToPos%t%on$pos%t%on*4
Str%n pr%,erNo,bre4 Str%n pr%,erApell%do4
pr%,erNo,bre 2 UConsultas6obtenerStr%n$%te,s+ Contactos6PRIMER_NOMRE*4 pr%,erApell%do 2 UConsultas6obtenerStr%n$%te,s+ Contactos6PRIMER_APE!!IDO*4
older6no,bre6setTe=t$Str%n6/or,at$5s s5+ pr%,erNo,bre+ pr%,erApell%do**4
O&err%de publ%c %nt etIte,Count$* > %/ $%te,s 2 null* return %te,s6etCount$*4 return .4
publ%c &o%d sapCursor$Cursor nue&oCursor* > %/ $nue&oCursor 2 null* > %te,s 2 nue&oCursor4 not%/8DataSetCaned$*4
publ%c Cursor etCursor$* > return %te,s4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 51/113
Si observas el c&di*o notar)s lo si*uiente9
• El método etIte,Count$* se basa en el resultado de s%e$* del cursor %te,s!
• -entro de on%ndV%e3older$* usamos ,o&eToPos%t%on$* en el cursor ara auntar al re*istro actual! "ue*o se obtiene elnombre / aellido del contacto Ccomo se vio en el wireframeD con el método de utilidad UConsultas6obtenerStr%n$*, araasi*narlo a cada ítem de la lista!
• saremos un método sapCursor$* ara intercambiar los datos del cursor actual con uno nuevo!
• Relacionaremos la columna '%dContacto' con la osici&n dentro del adatador con el método obtenerIdContacto$*! Estocon el fin de relacionar ambas valores de forma directa!
$(ora te re*untar)s, #c'mo funciona la escucha declarada dentro del recycler)
Sencillo! -ebido a 'ue el view (older reresenta cada fila en forma de view, entonces convertimos a este elemento en una escuc(a deltio V%e6OnCl%cZ!%stener!
"o si*uiente es crear una interfa% 'ue reresente al elemento 'ue escuc(ar) lo 'ue escuc(& el view (older de forma secuencial! Esta esla interfa% OnIte,Cl%cZ!%stener la cual tendr) an)lo*amente un controlador onCl%cZ$* 'ue recibe el view (older / a %dContacto!
+omo ves, el controlador OnCl%cZ!%stener6onCl%cZ$* en el view (older llama a su ve% al controladorOnIte,Cl%cZ!%stener6onCl%cZ$* con los valores actuales!
#; quién ser3 la escucha)
<=a actividad de contactos>
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 52/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 53/113
&alores6put$Contactos6ID_CONTACTO+ Contactos6enerarIdContacto$**4 &alores6put$Contactos6PRIMER_NOMRE+ 5Roberto5*4 &alores6put$Contactos6PRIMER_APE!!IDO+ 51o,e5*4 &alores6put$Contactos6TE!E"ONO+ 55*4 &alores6put$Contactos6CORREO+ 5robert%co,a%l6co,5*4
&alores6put$Contactos6VERSION+ UT%e,po6obtenerT%e,po$**4
db6%nsertOrTro$Tablas6CONTACTO+ null+ &alores*4
77 Re%stro ee,plo Y( &alores6clear$*4 &alores6put$Contactos6ID_CONTACTO+ Contactos6enerarIdContacto$**4 &alores6put$Contactos6PRIMER_NOMRE+ 5Pablo5*4 &alores6put$Contactos6PRIMER_APE!!IDO+ 5Catatu,bo5*4 &alores6put$Contactos6TE!E"ONO+ 5)))))))5*4 &alores6put$Contactos6CORREO+ 5pabl%to,a%l6co,5*4 &alores6put$Contactos6VERSION+ UT%e,po6obtenerT%e,po$**4
db6%nsertOrTro$Tablas6CONTACTO+ null+ &alores*4
Paso #! <reara la actividad de lista de contactos!
Ba/ varias cosas or (acer si 'ueremos mostrar nuestra lista oblada!
aD mlemente las interfaces !oaderCallbacZs / AdaptadorContactos6OnIte,Cl%cZ!%stener ! bD <reara la lista obteniendo el rec/cler / asi*nado un !%near!a8outManaer / el adatador!cD nicia un nuevo !oader / consulta todos los contactos en onCreate!oader$*! "ue*o usa el método sapCursor$* del adatador en
on!oad"%n%sed$* ara actuali%ar los datos!dD Escribe la declaraci&n del método onCl%cZ$* de la interfa% del adatador!eD 3uarda la clave de $< ara al*unos de los usuarios 'ue tienes en la base de datos en tu arc(ivo de referencias! "ue*o usaremos laclave ara enviar eticiones con :olley! Si descar*as el c&di*o comleto odr)s ver la clase UPre/erenc%as, donde ten*o un método refabricado ara *uardar / obtener esta clave!
"e/endo las tareas anteriores uedes comen%ar a editar tu actividad! 6 *uíate or el si*uiente c&di*o9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 54/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 55/113
pr%&ate &o%d preparar!%sta$* > rec%clador 2 $Rec8clerV%e* /%ndV%e8Id$R6%d6rec%clador*4 la8outManaer 2 ne !%near!a8outManaer$t%s*4 adaptador 2 ne AdaptadorContactos$t%s*4
rec%clador6set!a8outManaer$la8outManaer*4 rec%clador6setAdapter$adaptador*4
O&err%de publ%c !oader9CursorF onCreate!oader$%nt %d+ undle ars* > return ne Cursor!oader$ t%s+ Contactos6URI_CONTENIDO+ null+ Contactos6E!IMINADO [ 52:5+ ne Str%nJK>5.5+ null*4
O&err%de publ%c &o%d on!oad"%n%sed$!oader9CursorF loader+ Cursor data* > adaptador6sapCursor$data*4
O&err%de publ%c &o%d on!oaderReset$!oader9CursorF loader* > adaptador6sapCursor$null*4
O&err%de publ%c boolean onCreateOpt%onsMenu$Menu ,enu* > etMenuIn/later$*6%n/late$R6,enu6,enu_l%sta_contactos+ ,enu*4 return true4
O&err%de publ%c boolean onOpt%onsIte,Selected$MenuIte, %te,* > %nt %d 2 %te,6etIte,Id$*4 %/ $%d 22 R6%d6acc%on_s8nc* > 77 S%ncron%ac%n
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 56/113
return true4
return super6onOpt%onsIte,Selected$%te,*4
O&err%de publ%c &o%d onCl%cZ$AdaptadorContactos6V%e3older older+ Str%n %dContacto* > 77 Acc%ones
E#ecuta / ver)s la si*uiente ima*en9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 57/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 58/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 59/113
7ota 'ue si la el icono de confirmaci&n en la toolbar es resionado, entonces se inicia una tarea asíncrona llamadaTareaA@ad%rContacto, dentro de la cual usaremos el comando ContentResol&er6%nsert$* ara a.adir los datos del formulario a latabla contacto! Esto evitar) alterar el (ilo rincial con la inserci&n!
+on este es'uema *lobal en la mente comen%aré a codificar los comonentes!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 60/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 61/113
91r%d!a8out =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 =,lnsBapp25ttpB77sce,as6andro%d6co,7apZ7res-auto5 =,lnsBtools25ttpB77sce,as6andro%d6co,7tools5 andro%dBla8out_%dt25,atc_parent5 andro%dBla8out_e%t25rap_content5
andro%dBcolu,nCount25(5 andro%dBpadd%notto,25d%,en7act%&%t8_&ert%cal_,ar%n5 andro%dBpadd%n!e/t25d%,en7act%&%t8_or%ontal_,ar%n5 andro%dBpadd%nR%t25d%,en7act%&%t8_or%ontal_,ar%n5 andro%dBpadd%nTop25d%,en7act%&%t8_&ert%cal_,ar%n5 andro%dBroCount255 appBla8out_bea&%or25str%n7appbar_scroll%n_&%e_bea&%or5 toolsBconte=t256u%6Act%&%dadInserc%onContacto5 toolsBsoIn25la8out7act%&%dad_%nserc%on_contacto5F
9I,aeV%e andro%dB%d25[%d7%cono_no,bre5
andro%dBla8out_%dt25rap_content5 andro%dBla8out_e%t25rap_content5 andro%dBla8out_colu,n25.5 andro%dBla8out_ra&%t825center_&ert%cal5 andro%dBla8out_ro25.5 andro%dBsrc25draable7%cono_cuenta5 7F
9andro%d6support6des%n6%det6Te=tInput!a8out andro%dB%d25[%d7,ascara_ca,po_no,bre5 andro%dBla8out_%dt25rap_content5 andro%dBla8out_e%t25rap_content5 andro%dBla8out_colu,n2505 andro%dBla8out_ra&%t825center_or%ontal5 andro%dBla8out_ro25.5F
9Ed%tTe=t andro%dB%d25[%d7ca,po_pr%,er_no,bre5 andro%dBla8out_%dt25rap_content5 andro%dBla8out_e%t25rap_content5 andro%dBla8out_e%t2505 andro%dBe,s250.5
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 62/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 63/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 64/113
menu_insercion_contacto.xml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9,enu =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 =,lnsBapp25ttpB77sce,as6andro%d6co,7apZ7res-auto5F
9%te, andro%dB%d25[%d7acc%on_con/%r,ar5 andro%dB%con25draable7%cono_oZ5 andro%dBt%tle25str%n7acc%on_uardar5 appBsoAsAct%on25%/Roo,5 7F97,enuF
+on estos movimientos /a disones de los elementos visuales 'ue activar)n la inserci&n!
Paso #-! odifica la actividad de inserci&n ara 'ue recolecte los datos asi*nados or el usuario en cada Ed%tTe=t! +ada uno de estosdeben ser a.adidos a un ContentValues 'ue se asar) a la tarea asíncrona, la cual usar) al content resolver ara insertar estos datos!
ActividadnsercionContacto.java
publ%c class Act%&%dadInserc%onContacto e=tends AppCo,patAct%&%t8>
77 Re/erenc%as UI pr%&ate Ed%tTe=t ca,poPr%,erNo,bre4 pr%&ate Ed%tTe=t ca,poPr%,erApell%do4 pr%&ate Ed%tTe=t ca,poTele/ono4 pr%&ate Ed%tTe=t ca,poCorreo4
O&err%de protected &o%d onCreate$undle sa&edInstanceState* > super6onCreate$sa&edInstanceState*4 setContentV%e$R6la8out6act%&%dad_%nserc%on_contacto*4
arearToolbar$*4
77 Encontrar Re/erenc%as UI
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 65/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 66/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 67/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 68/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 69/113
;!5 )odi.icar 2 Eliminar Contactos
<ara modificar un contacto ensé en reciclar la actividad de inserci&n, /a 'ue se re'uiere el mismo formulario, ero con los camos deteto reviamente car*ados!
-e esta forma a(orraría *ran cantidad de tiemo / c&di*o! Solo tendría 'ue recibir la uri del contacto / comen%ar una car*a de datos ara asi*narlos a cada edit tet! ncluso se uede usar la misma TareaInsertarContacto ara la modificaci&n!
En cuanto a la eliminaci&n, usaré un action button! $l momento de resionarlo se iniciar) una tarea asíncrona 'ue use el métodoContentResol&er6delete$* ara marcar el contacto como eliminado o eliminarlo definitivamente si a?n no (a sido sincroni%ado!
-é#ame ilustrarte con un dia*rama9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 70/113
<Codifiquemos>
Paso #! -irí*ete a Actividad/istaContactos!>ava e inicia la actividad Act%&%dadInserc%onContacto a través destartAct%&%t8$*! El intent 'ue lleve consi*o debe tener la uri del contacto seleccionado, la cual uedes construir con el métodoContactos6constru%rUr%Contacto$*!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 71/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 72/113
ca,poPr%,erNo,bre6setTe=t$UConsultas6obtenerStr%n$data+ Contactos6PRIMER_NOMRE**4 ca,poPr%,erApell%do6setTe=t$UConsultas6obtenerStr%n$data+ Contactos6PRIMER_APE!!IDO**4 ca,poTele/ono6setTe=t$UConsultas6obtenerStr%n$data+ Contactos6TE!E"ONO**4 ca,poCorreo6setTe=t$UConsultas6obtenerStr%n$data+ Contactos6CORREO**4
O&err%depubl%c !oader9CursorF onCreate!oader$%nt %d+ undle ars* > return ne Cursor!oader$t%s+ ur%Contacto+ null+ null+ null+ null*4
O&err%depubl%c &o%d on!oad"%n%sed$!oader9CursorF loader+ Cursor data* > poblarV%es$data*4
O&err%depubl%c &o%d on!oaderReset$!oader9CursorF loader* >
Paso #0! El si*uiente movimiento es actuali%ar la tarea asíncrona de inserci&n ara 'ue reciba una uri en su método e=ecute$*! +onesto odremos identificar dos casos osibles, donde el valor de null si*nifica 'ue (aremos una inserci&n C%nsert$*D / una urieistente indica actuali%ar el re*istro Cupdate$*D!
stat%c class TareaAnad%rContacto e=tends As8ncTasZ9Ur%+ Vo%d+ Vo%dF > pr%&ate /%nal ContentResol&er resol&er4 pr%&ate /%nal ContentValues &alores4
publ%c TareaAnad%rContacto$ContentResol&er resol&er+ ContentValues &alores* > t%s6resol&er 2 resol&er4 t%s6&alores 2 &alores4
O&err%de protected Vo%d doInacZround$Ur%666 ars* > Ur% ur% 2 arsJ.K4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 73/113
%/ $null 2 ur%* > 7? Ver%/%cac%nB S% el contacto ;ue se &a a actual%ar an no a s%do s%ncron%ado+ es dec%r su colu,na '%nsertado' 2 0+ entonces la colu,na ',od%/%cado' no debe ser alterada
?7 Cursor c 2 resol&er6;uer8$ur%+ ne Str%nJK>Contactos6INSERTADO+ null+ null+ null*4
%/ $c 2 null WW c6,o&eToNe=t$** >
77 Ver%/%cac%n de s%ncron%ac%n %/ $UConsultas6obtenerInt$c+ Contactos6INSERTADO* 22 .* > &alores6put$Contactos6MODI"ICADO+ 0*4
&alores6put$Contactos6VERSION+ UT%e,po6obtenerT%e,po$**4 resol&er6update$ur%+ &alores+ null+ null*4
else > resol&er6%nsert$Contactos6URI_CONTENIDO+ &alores*4 return null4
6bviamente esto obli*a a 'ue dentro del método %nsertar$* se a.ada la uri del contacto de la si*uiente forma9
ne TareaAnad%rContacto$etContentResol&er$*+ &alores*6e=ecute$ur%Contacto*4
Paso #5! "a eliminaci&n re'uiere de un nuevo action button ara disarar el evento! Eso si*nifica una modificaci&n del arc(ivomenuinsercioncontacto!:ml! Heamos9
menu_insercion_contacto.xml
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 74/113
9:=,l &ers%on2506.5 encod%n25ut/-5:F9,enu =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 =,lnsBapp25ttpB77sce,as6andro%d6co,7apZ7res-auto5F
9%te,
andro%dB%d25[%d7acc%on_con/%r,ar5 andro%dB%con25draable7%cono_oZ5 andro%dBt%tle25str%n7acc%on_uardar5 appBsoAsAct%on25%/Roo,5 7F
9%te, andro%dB%d25[%d7acc%on_el%,%nar5 andro%dBt%tle25str%n7acc%on_el%,%nar5 andro%dB&%s%ble25/alse5 appBsoAsAct%on25ne&er5 7F97,enuF
acc%on_el%,%nar or defecto estar) oculto, /a 'ue en la inserci&n normal no debe aarecer! <ero en la modificaci&n contactos esnecesario! <ara ello verifica dentro de onCreateOpt%onsMenu$* si ur%Contacto es diferente de null / lue*o cambia la visibilidad delítem!
O&err%depubl%c boolean onCreateOpt%onsMenu$Menu ,enu* > etMenuIn/later$*6%n/late$R6,enu6,enu_%nserc%on_contacto+ ,enu*4
77 Ver%/%cac%n de &%s%b%l%dad %/ $ur%Contacto 2 null* > ,enu6/%ndIte,$R6%d6acc%on_el%,%nar*6setV%s%ble$true*4
return true4
Paso #;! +rear una nueva tarea asíncrona llamada TareaEl%,%narContacto ara eliminar el re*istro actual a través de la uri como ar)metro!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 75/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 76/113
%nt %nsertado4
%/ $c 2 null WW c6,o&eToNe=t$** > %nsertado 2 UConsultas6obtenerInt$c+ Contactos6INSERTADO*4 else >
return null4
%/ $%nsertado 22 0* > resol&er6delete$arsJ.K+ null+ null*4 else %/ $%nsertado 22 .* > ContentValues &alores 2 ne ContentValues$*4 &alores6put$Contactos6E!IMINADO+ 0*4 resol&er6update$arsJ.K+ &alores+ null+ null*4
return null4
+on estas acciones creadas, /a es osible clicMear cada item de la lista / ver su contenido *uardado!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 77/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 78/113
;!; Sincroni$ar el cliente Android
"a sincroni%aci&n local o del cliente $ndroid se basa en el resultado 'ue arro#e la etici&n 1ET (acia el recurso s8nc 'ue vimos en elaartado n?mero I!
"a idea es comarar la car*a de contactos 'ue envía el servidor con los contactos locales en S"ite! -e este resultado 'uedar)na'uellos elementos 'ue deben ser a*re*ados, modificados / eliminados de la base de datos local!
"a sincroni%aci&n la imlementaremos con el frameworM de S/nc$daters de $ndroid ara reducir la dificultad de uso de servicios /momentos de sincroni%aci&n!
-ebido a 'ue la sincroni%aci&n es or demanda CmanualD, necesitamos un action button ara disarar la acci&n! $dem)s me areceideal avisar a la interfa% 'ue la sincroni%aci&n termin& eitosamente o se detuvo or errores!
6bserva c&mo 'uedaría la ar'uitectura9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 79/113
El rocesador local es una entidad 'ue se encar*a de transformar el formato JS67 a elementos Contacto! "ue*o (ace un roceso decomaraci&n ara determinar 'ué cambios son necesarios en el cliente! -e esta manera, envía oeraciones al content rovider ara 'uese actualice S"ite / or ende la actividad de contactos!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 80/113
+omencemos en orden!
Paso #! El usuario necesita un action button 'ue le ermite iniciar la sincroni%aci&n, así 'ue solo abre el arc(ivomenulistacontactos!:ml / a*ré*alo ara 'ue se manten*a visible!
menu_lista_contactos.xml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9,enu =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 =,lnsBapp25ttpB77sce,as6andro%d6co,7apZ7res-auto5F 9%te, andro%dB%d25[%d7acc%on_s8nc5 andro%dB%con25draable7%cono_s8nc5 andro%dBt%tle25str%n7acc%on_s8nc5 appBsoAsAct%on25%/Roo,5 7F97,enuF
Paso #-! "o si*uiente es disarar el evento de sincroni%aci&n al resionar acc%on_s8nc! <ara ello constru/e un método llamados%ncron%ar$* / convoca al método ContentResol&er6re;uestS8nc$* ara iniciar una sincroni%aci&n manual!
O&err%depubl%c boolean onOpt%onsIte,Selected$MenuIte, %te,* > %nt %d 2 %te,6etIte,Id$*4 %/ $%d 22 R6%d6acc%on_s8nc* > s%ncron%ar$*4 return true4
return super6onOpt%onsIte,Selected$%te,*4
pr%&ate &o%d s%ncron%ar$* >
77 Ver%/%cac%n para e&%tar %n%c%ar ,Gs de una s8nc a la &e Account cuentaAct%&a 2 UCuentas6obtenerCuentaAct%&a$t%s*4 %/ $ContentResol&er6%sS8ncAct%&e$cuentaAct%&a+ Contrato6AUTORIDAD** >
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 81/113
!o6d$TA1+ 5Inorando s%ncron%ac%n 8a ;ue e=%ste una en proceso65*4 return4
!o6d$TA1+ 5Sol%c%tando s%ncron%ac%n ,anual5*4
undle bundle 2 ne undle$*4 bundle6putoolean$ContentResol&er6S]NC_E#TRAS_E#PEDITED+ true*4 bundle6putoolean$ContentResol&er6S]NC_E#TRAS_MANUA!+ true*4 ContentResol&er6re;uestS8nc$cuentaAct%&a+ Contrato6AUTORIDAD+ bundle*4
El método UCuentas6obtenerCuentaAct%&a$* etrae la cuenta activa *uardada en las referencias! <uedes ver su contenido sidescar*as el c&di*o!
Recuerda 'ue en mi artículo N+&mo Sincroni%ar S"ite con /S" En $ndroidO te eli'ué 'ue la sincroni%aci&n or demanda se dasi asamos como ar*umentos S]NC_E#TRAS_E#PEDITED / S]NC_E#TRAS_MANUA! con el valor de true!
<or el momento no suceder) nada or'ue no tenemos un S2ncAdapter creado todavía, así 'ue rocederé a crearlo!
Paso #-! +rea un S/nc$dater ara reali%ar las sincroni%aciones! Recuerda 'ue también es necesario un autenticador ara 'ue elframeworM funcione correctamente!
El autenticador re'uiere de una definici&n F" ara la informaci&n *eneral de las cuentas! <ara construirlo, crea un nuevo arc(ivodentro de la careta res:ml llamado autenticador!:ml / a.ade el si*uiente c&di*o!
autenticador.xml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9account-autent%cator =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 andro%dBaccountT8pe25str%n7t%po_cuenta5 andro%dB%con25,%p,ap7%c_launcer5 andro%dBlabel25str%n7app_na,e5 andro%dBs,allIcon25,%p,ap7%c_launcer5 7F
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 82/113
$(ora a.ade al Android)ani.est!:ml el ermiso ara autenticaciones9
9-- Autent%cac%n --F9uses-per,%ss%on andro%dBna,e25andro%d6per,%ss%on6AUT3ENTICATE_ACCOUNTS57F
$(ora crea la clase autenticadora dentro del a'uete s2nc, 'ue etienda de AbstractAccountAutent%cator! +omo no usaremosautenticaci&n de cuentas, solo sobrescribe en blanco los métodos!
Autenticador.java
7? ? Autent%cador au=%l%ar para la apl%cac%n ?7publ%c class Autent%cador e=tends AbstractAccountAutent%cator >
publ%c Autent%cador$Conte=t conte=t* >
super$conte=t*4
O&err%de publ%c undle ed%tPropert%es$ AccountAutent%catorResponse r+ Str%n s* > tro ne UnsupportedOperat%onE=cept%on$*4
O&err%de publ%c undle addAccount$ AccountAutent%catorResponse r+
Str%n s+ Str%n s(+ Str%nJK str%ns+ undle bundle* tros NetorZErrorE=cept%on > return null4
O&err%de publ%c undle con/%r,Credent%als$
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 83/113
AccountAutent%catorResponse r+ Account account+ undle bundle* tros NetorZErrorE=cept%on > return null4
O&err%de publ%c undle etAutToZen$ AccountAutent%catorResponse r+ Account account+ Str%n s+ undle bundle* tros NetorZErrorE=cept%on > tro ne UnsupportedOperat%onE=cept%on$*4
O&err%de publ%c Str%n etAutToZen!abel$Str%n s* > tro ne UnsupportedOperat%onE=cept%on$*4
O&err%de publ%c undle updateCredent%als$ AccountAutent%catorResponse r+ Account account+ Str%n s+ undle bundle* tros NetorZErrorE=cept%on > tro ne UnsupportedOperat%onE=cept%on$*4
O&err%de publ%c undle as"eatures$
AccountAutent%catorResponse r+ Account account+ Str%nJK str%ns* tros NetorZErrorE=cept%on > tro ne UnsupportedOperat%onE=cept%on$*4
<ara finali%ar el se*mento de la autenticaci&n ve a <ile F =e, F Service F Service / nombra al nuevo servicioSer&%c%oAutent%cac%on! Este comonente también ser) auiliar, or lo 'ue sus métodos van sobrescritos or defecto!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 84/113
!ervicioAutenticacion.java
publ%c class Ser&%c%oAutent%cac%on e=tends Ser&%ce > 77 Instanc%a del autent%cador pr%&ate Autent%cador autent%cador4
O&err%de publ%c &o%d onCreate$* > 77 Nue&a %nstanc%a del autent%cador autent%cador 2 ne Autent%cador$t%s*4
7? ? !%ando el ser&%c%o al /ra,eorZ de Andro%d ?7 O&err%de publ%c I%nder on%nd$Intent %ntent* >
return autent%cador6etI%nder$*4
"o si*uiente es li*ar la informaci&n de autenticaci&n con el servicio dentro del manifesto!
9ser&%ce andro%dBna,e256s8nc6Ser&%c%oAutent%cac%on5 andro%dBenabled25true5 andro%dBe=ported25true5 F 9%ntent-/%lterF 9act%on andro%dBna,e25andro%d6accounts6AccountAutent%cator5 7F
97%ntent-/%lterF
9,eta-data andro%dBna,e25andro%d6accounts6AccountAutent%cator5 andro%dBresource25=,l7autent%cador5 7F97ser&%ceF
+on eso la /a (emos satisfec(o la secci&n de autenticaci&n! $(ora comencemos con la sincroni%aci&n!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 85/113
"o rimero es a.adir los ermisos ara 'ue el frameworM sincronice9
9-- S%ncron%ac%n --F9uses-per,%ss%on andro%dBna,e25andro%d6per,%ss%on6RITE_S]NC_SETTIN1S57F9uses-per,%ss%on andro%dBna,e25andro%d6per,%ss%on6READ_S]NC_SETTIN1S57F
$(ora crea una nueva clase Java llamada S8ncAdapter 'ue (erede de AbstractTreaderS8ncAdapter! +rea dos constructores, unocon la firma ara versiones inferiores a la G!0 / otra ara las recientes! En se*uida sobrescribe el método onPer/or,S8nc$* en blanco!
!yncAdapter.java
publ%c class S8ncAdapter e=tends AbstractTreadedS8ncAdapter >
pr%&ate stat%c /%nal Str%n TA1 2 S8ncAdapter6class6etS%,pleNa,e$*4
pr%&ate ContentResol&er resol&er4
publ%c S8ncAdapter$Conte=t conte=t+ boolean autoIn%t%al%e* > super$conte=t+ autoIn%t%al%e*4 resol&er 2 conte=t6etContentResol&er$*4
7?? ? Constructor para ,antener co,pat%b%l%dad en &ers%ones %n/er%ores a 6. ?7 publ%c S8ncAdapter$ Conte=t conte=t+ boolean autoIn%t%al%e+
boolean alloParallelS8ncs* > super$conte=t+ autoIn%t%al%e+ alloParallelS8ncs*4 resol&er 2 conte=t6etContentResol&er$*4
O&err%de publ%c &o%d onPer/or,S8nc$Account account+ undle e=tras+ Str%n autor%t8+
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 86/113
ContentPro&%derCl%ent pro&%der+ /%nal S8ncResult s8ncResult* >
!o6%$TA1+ 5Co,enando a s%ncron%arB5 [ account*4
$*re*a un nuevo bound service al a'uete s2nc, desde el men? <ile / ll)malo Ser&%c%oS%ncron%ac%on! -entro de este onCreate$*
crea la instancia del s/nc adater / lue*o asa su interfa% de comunicaci&n en on%nd$*!
!ervicio!incroni"acion.java
publ%c class Ser&%c%oS%ncron%ac%on e=tends Ser&%ce > 77 Instanc%a del s%ncron%ar adapter pr%&ate stat%c S8ncAdapter s8ncAdapter 2 null4
77 Obeto para pre&en%r errores entre %los pr%&ate stat%c /%nal Obect locZ 2 ne Obect$*4
O&err%de publ%c &o%d onCreate$* > s8ncron%ed $locZ* > %/ $s8ncAdapter 22 null* > s8ncAdapter 2 ne S8ncAdapter$etAppl%cat%onConte=t$*+ true*4
7?? ? Retorna %nter/a de co,un%cac%n para uso %nterno del /ra,eorZ ?7 O&err%de publ%c I%nder on%nd$Intent %ntent* > return s8ncAdapter6etS8ncAdapter%nder$*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 87/113
7o olvides 'ue este servicio re'uiere una confi*uraci&n revia 'ue se describe en un arc(ivo ml con la eti'ueta 9s8nc-adapterF!Sabiendo esto, crea un nuevo arc(ivo dentro de res:ml 'ue se llame s2ncadapter!:ml / a*re*a las si*uientes características9
s2ncadapter!:ml
9:=,l &ers%on2506.5 encod%n25ut/-5:F9s8nc-adapter =,lnsBandro%d25ttpB77sce,as6andro%d6co,7apZ7res7andro%d5 andro%dBaccountT8pe25str%n7t%po_cuenta5 andro%dBalloParallelS8ncs25/alse5 andro%dBcontentAutor%t825str%n7autor%dad_pro&%der5 andro%dBsupportsUpload%n25true5 andro%dBuserV%s%ble25/alse5 7F
$ su ve% necesitamos li*ar esta confi*uraci&n al servicio en el Android)ani.est!:ml en sus metadatos!
9ser&%ce
andro%dBna,e256s8nc6Ser&%c%oS%ncron%ac%on5 andro%dBenabled25true5 andro%dBe=ported25true5 F 9%ntent-/%lterF 9act%on andro%dBna,e25andro%d6content6S8ncAdapter5 7F 97%ntent-/%lterF
9,eta-data andro%dBna,e25andro%d6content6S8ncAdapter5 andro%dBresource25=,l7s8nc_adapter5 7F97ser&%ceF
Basta a'uí el s/nc adater se e#ecuta cuando el usuario resiona el bot&n de sincroni%aci&n, ero no sucede absolutamente nada, /a 'ueonPer/or,S8nc$* no tiene acciones or e#ecutar! <ara ello tenemos 'ue crear un comonente 'ue acceda al servidor rimero!
Paso #0! +rea una nueva clase llamada RESTSer&%ce dentro del a'uete ,eb! El ro&sito de esta es usar a Holle/ ara crear dosmétodo reresentativos del servicio web9 et$* / post$*!
#$!%!ervice.java
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 88/113
publ%c class RESTSer&%ce >
pr%&ate stat%c /%nal Str%n TA1 2 RESTSer&%ce6class6etS%,pleNa,e$*4
pr%&ate /%nal Conte=t conte=to4
publ%c RESTSer&%ce$Conte=t conte=to* > t%s6conte=to 2 conte=to4
publ%c &o%d et$Str%n ur%+ Response6!%stener9SONObectF son!%stener+ Response6Error!%stener error!%stener+ /%nal 3asMap9Str%n+ Str%nF cabeceras* >
77 Crear pet%c%n 1ET sonObectRe;uest pet%c%on 2 ne sonObectRe;uest$ ur%+ null+ son!%stener+ error!%stener * > O&err%de publ%c Map9Str%n+ Str%nF et3eaders$* tros Aut"a%lureError > return cabeceras4 4
77 A@ad%r pet%c%n a la p%la Volle8S%nleton6etInstance$conte=to*6addToRe;uest\ueue$pet%c%on*4
publ%c &o%d post$Str%n ur%+ Str%n datos+ Response6!%stener9SONObectF son!%stener+ Response6Error!%stener error!%stener+ /%nal 3asMap9Str%n+ Str%nF cabeceras* >
77 Crear pet%c%n POST sonObectRe;uest pet%c%on 2 ne sonObectRe;uest$ Re;uest6Metod6POST+
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 89/113
ur%+ datos+ son!%stener+ error!%stener * > O&err%de publ%c Map9Str%n+ Str%nF et3eaders$* tros Aut"a%lureError > return cabeceras4 4
77 A@ad%r pet%c%n a la p%la Volle8S%nleton6etInstance$conte=to*6addToRe;uest\ueue$pet%c%on*4
;)sicamente lo 'ue (a*o es encasular eticiones sonObectRe;uest de Holle/ en métodos 'ue ermitan tener control desde afuera!<ara Holle/ uso el si*uiente sin*leton!
&olley!ingleton.java
publ%c /%nal class Volle8S%nleton >
77 Atr%butos pr%&ate stat%c Volle8S%nleton s%nleton4 pr%&ate Re;uest\ueue re;uest\ueue4 pr%&ate stat%c Conte=t conte=t4
pr%&ate Volle8S%nleton$Conte=t conte=t* > Volle8S%nleton6conte=t 2 conte=t4 re;uest\ueue 2 etRe;uest\ueue$*4
7?? ? Retorna la %nstanc%a un%ca del s%nleton
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 90/113
? ? para, conte=t conte=to donde se eecutarGn las pet%c%ones ? return Instanc%a ?7 publ%c stat%c s8ncron%ed Volle8S%nleton etInstance$Conte=t conte=t* > %/ $s%nleton 22 null* > s%nleton 2 ne Volle8S%nleton$conte=t6etAppl%cat%onConte=t$**4 return s%nleton4
7?? ? Obt%ene la %nstanc%a de la cola de pet%c%ones ? ? return cola de pet%c%ones ?7 pr%&ate Re;uest\ueue etRe;uest\ueue$* > %/ $re;uest\ueue 22 null* >
re;uest\ueue 2 Volle86neRe;uest\ueue$conte=t6etAppl%cat%onConte=t$**4 return re;uest\ueue4
7?? ? A@ade la pet%c%n a la cola ? ? para, re; pet%c%n ? para, 9TF Resultado /%nal de t%po T ?7 publ%c 9TF &o%d addToRe;uest\ueue$Re;uest9TF re;* >
etRe;uest\ueue$*6add$re;*4
$mbos tienen la sobrescritura del método et3eaders$*, donde se asi*nan las cabeceras 'ue se indi'uen en el ?ltimo ar)metro decada método!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 91/113
Si a?n no sabes c&mo funciona volle/, entonces lee mi artículo sobre creaci&n de eticiones BTT< con Holle/!
Teniendo el método et$* /a uedes enviar la etici&n al servidor desde onPer/or,S8nc$* de la si*uiente forma9
O&err%depubl%c &o%d onPer/or,S8nc$Account account+ undle e=tras+ Str%n autor%t8+ ContentPro&%derCl%ent pro&%der+ /%nal S8ncResult s8ncResult* >
!o6%$TA1+ 5Co,enando a s%ncron%arB5 [ account*4
77 S%ncron%ac%n local s8nc!ocal$*4
pr%&ate &o%d s8nc!ocal$* > 77 Construcc%n de cabeceras 3asMap9Str%n+ Str%nF cabeceras 2 ne 3asMap9F$*4 cabeceras6put$5Autor%at%on5+ UPre/erenc%as6obtenerCla&eAp%$etConte=t$***4
77 Pet%c%n 1ET ne RESTSer&%ce$etConte=t$**6et$UR!_S]NC_ATC3+ ne Response6!%stener9SONObectF$* > O&err%de publ%c &o%d onResponse$SONObect response* > 77 Procesar 1ET
+ ne Response6Error!%stener$* > O&err%de publ%c &o%d onErrorResponse$Volle8Error error* > 77 Procesar Error + cabeceras*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 92/113
-onde UR!_S]NC_ATC3 es la ubicaci&n del recurso s2nc en el servidor local!
77 Recurso s8nc $0.6.66( -F 1en8,ot%on4 0.6.6(6( -F AVD*publ%c stat%c /%nal Str%n UR!_S]NC_ATC3 2 5ttpB770.6.66(7ap%6peopleapp6co,7&07s8nc54
Paso #5! "a etici&n 'ue se lan%& desde s8nc!ocal$* no rocesa la resuesta o error 'ue esta rodu%ca! "a ar'uitectura muestra 'ueusaremos un comonente llamado Procesador!ocal, el cual se encar*a de transformar el contenido JS67 en <6J6s Java arareali%ar una comaraci&n!
7o obstante, rimero es necesario crear la clase 'ue reresente l&*icamente a cada contacto ara 'ue el rocesador la imlemente!
El ob#etivo de la clase Contacto es mostrar los atributos de cada re*istro ara reali%ar el arsin* JS67 resectivo! Su contenido seríaeste9
Contacto.java
publ%c class Contacto >
publ%c Str%n %dContacto4 publ%c Str%n pr%,erNo,bre4 publ%c Str%n pr%,erApell%do4 publ%c Str%n tele/ono4 publ%c Str%n correo4 publ%c Str%n &ers%on4 publ%c %nt ,od%/%cado4
publ%c Contacto$Str%n %dContacto+ Str%n pr%,erNo,bre+
Str%n pr%,erApell%do+ Str%n tele/ono+ Str%n correo+ Str%n &ers%on+ %nt ,od%/%cado* > t%s6%dContacto 2 %dContacto4 t%s6pr%,erNo,bre 2 pr%,erNo,bre4 t%s6pr%,erApell%do 2 pr%,erApell%do4 t%s6tele/ono 2 tele/ono4 t%s6correo 2 correo4 t%s6&ers%on 2 &ers%on4 t%s6,od%/%cado 2 ,od%/%cado4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 93/113
publ%c &o%d apl%carSan%dad$* > %dContacto 2 %dContacto 22 null : 55 B %dContacto4 pr%,erNo,bre 2 pr%,erNo,bre 22 null : 55 B pr%,erNo,bre4 pr%,erApell%do 2 pr%,erApell%do 22 null : 55 B pr%,erApell%do4 tele/ono 2 tele/ono 22 null : 55 B tele/ono4 correo 2 correo 22 null : 55 B correo4 &ers%on 2 &ers%on 22 null : UT%e,po6obtenerT%e,po$* B &ers%on4 ,od%/%cado 2 .4
publ%c %nt esMasRec%ente$Contacto ,atc* > S%,pleDate"or,at /or,ato 2 ne S%,pleDate"or,at$58888-MM-dd B,,Bss5*4 tr8 > Date /ecaA 2 /or,ato6parse$&ers%on*4 Date /eca 2 /or,ato6parse$,atc6&ers%on*4
return /ecaA6co,pareTo$/eca*4
catc $ParseE=cept%on e* > e6pr%ntStacZTrace$*4 return .4
publ%c boolean co,pararCon$Contacto otro* > return %dContacto6e;uals$otro6%dContacto* WW pr%,erNo,bre6e;uals$otro6pr%,erNo,bre* WW pr%,erApell%do6e;uals$otro6pr%,erApell%do* WW
tele/ono6e;uals$otro6tele/ono* WW correo6e;uals$otro6correo*4
Esta clase tiene tres métodos indisensable ara sincroni%ar9
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 94/113
• apl%carSan%dad$*9 "o uso al momento de arsear la resuesta JS67 en o#os ara evitar tener camos con el valor null 'ue er#udi'uen las comaraciones 'ue se (acen en co,pararCon$*!
• esMasRec%ente$*9 +omarar dos ob#etos +ontacto ara determinar cual es mas reciente basado en el atributo version!
• co,pararCon$*9 -etermina si dos contactos son i*uales!
Paso #;! +omo /a lo (e venido diciendo, el rocesador transforma la resuesta JS67 en unidades de datos entendibles en la l&*ica del ro*rama Cinstancias de ContactoD!
"ue*o comara los re*istros de S"ite eistentes con los contactos resultantes del arsin* / determina 'ue inserciones,modificaciones / eliminaciones deben reali%arse localmente!
El al*oritmo *eneral sería así9
a' <arsear arra/ JS67 de contactos a instancias Contactob' +onsultar los contactos localesc' +omarar cada contacto local con la lista de remotos, donde P Si el contacto local eiste en la lista de remotos, entonces se descarta de inserci&n P Si el contacto local eiste, entonces buscar diferencias con el remoto ara ro*ramar actuali%aci&n P Si el contacto local no eisten en la lista remota, entonces ro*ramar eliminaci&nd' Enviar todas las oeraciones ro*ramadas
$sectos a destacar9
• sa la clase ContentPro&%derOperat%on / sus método est)ticos newInsert(), newUpdate() / newDelete() ara reresentar una oeraci&n 'ue ser* e#ecutada como arte de un batc( en el ContentPro&%der, con appl8atc$*!
• "a librería Bson te ermite refle#ar un strin* con formato JS67 en un ob#eto 'ue coincida con los atributos 'ue oseen!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 95/113
• $lmacena la lista de contactos remotos en un 3asMap 'ue use a %dContacto como clave, ara variar el contenido f)cilmentese*?n las comaraciones!
El c&di*o roducido ara el rocesador sería el si*uiente9
ProcesadorLocal.java
publ%c class Procesador!ocal >
pr%&ate stat%c /%nal Str%n TA1 2 Procesador!ocal6class6etS%,pleNa,e$*4
pr%&ate %nter/ace ConsultaContactos >
77 Pro8ecc%n para consulta de contactos Str%nJK PRO]ECCION 2 > Contactos6ID_CONTACTO+
Contactos6PRIMER_NOMRE+ Contactos6PRIMER_APE!!IDO+ Contactos6TE!E"ONO+ Contactos6CORREO+ Contactos6VERSION+ Contactos6MODI"ICADO 4
77 Ind%ces de colu,nas %nt ID_CONTACTO 2 .4 %nt PRIMER_NOMRE 2 04 %nt PRIMER_APE!!IDO 2 (4
%nt TE!E"ONO 2 4 %nt CORREO 2 4 %nt VERSION 2 )4 %nt MODI"ICADO 2 X4
77 Mapa para /%ltrar solo los ele,entos a s%ncron%ar pr%&ate 3asMap9Str%n+ ContactoF contactosRe,otos 2 ne 3asMap9F$*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 96/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 97/113
77 Crear ur% de este contacto Ur% updateUr% 2 Contactos6constru%rUr%Contacto$/%laActual6%dContacto*4
7? A;u se apl%ca la resoluc%n de con/l%ctos de ,od%/%cac%ones de un ,%s,o recurso tanto en el ser&%dro co,o en la app6 \u%Hn tena la &ers%n ,Gs actual+ serG to,ado
co,o preponderante ?7 %/ $,atc6co,pararCon$/%laActual** > %nt /la 2 ,atc6esMasRec%ente$/%laActual*4 %/ $/la F .* > !o6d$TA1+ 5Prora,ar actual%ac%n del contacto 5 [ updateUr%*4
77 Ver%/%cac%nB E=%ste con/l%cto de ,od%/%cac%n: %/ $/%laActual6,od%/%cado 22 0* > ,atc6,od%/%cado 2 .4 ops6add$constru%rOperac%onUpdate$,atc+ updateUr%**4
else > 7? Se deduce ;ue a;uellos ele,entos ;ue no co%nc%d%eron+ 8a no e=%sten en el ser&%dor+ por lo ;ue se el%,%narGn ?7 Ur% deleteUr% 2 Contactos6constru%rUr%Contacto$/%laActual6%dContacto*4 !o6%$TA1+ 5Prora,ar El%,%nac%n del contacto 5 [ deleteUr%*4
ops6add$ContentPro&%derOperat%on6neDelete$deleteUr%*6bu%ld$**4 c6close$*4
77 Insertar los %te,s resultantes 8a ;ue se asu,e ;ue no e=%sten en el contacto /or $Contacto contacto B contactosRe,otos6&alues$** >
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 98/113
!o6d$TA1+ 5Prora,ar Inserc%n de un nue&o contacto con ID 2 5 [ contacto6%dContacto*4 ops6add$constru%rOperac%onInsert$contacto**4
pr%&ate ContentPro&%derOperat%on constru%rOperac%onInsert$Contacto contacto* >
return ContentPro&%derOperat%on6neInsert$Contactos6URI_CONTENIDO* 6%tValue$Contactos6ID_CONTACTO+ contacto6%dContacto* 6%tValue$Contactos6PRIMER_NOMRE+ contacto6pr%,erNo,bre* 6%tValue$Contactos6PRIMER_APE!!IDO+ contacto6pr%,erApell%do* 6%tValue$Contactos6TE!E"ONO+ contacto6tele/ono* 6%tValue$Contactos6CORREO+ contacto6correo* 6%tValue$Contactos6VERSION+ contacto6&ers%on* 6%tValue$Contactos6INSERTADO+ .* 6bu%ld$*4
pr%&ate ContentPro&%derOperat%on constru%rOperac%onUpdate$Contacto ,atc+ Ur% updateUr%* >
return ContentPro&%derOperat%on6neUpdate$updateUr%* 6%tValue$Contactos6ID_CONTACTO+ ,atc6%dContacto* 6%tValue$Contactos6PRIMER_NOMRE+ ,atc6pr%,erNo,bre* 6%tValue$Contactos6PRIMER_APE!!IDO+ ,atc6pr%,erApell%do* 6%tValue$Contactos6TE!E"ONO+ ,atc6tele/ono* 6%tValue$Contactos6CORREO+ ,atc6correo* 6%tValue$Contactos6VERSION+ ,atc6&ers%on* 6%tValue$Contactos6MODI"ICADO+ ,atc6,od%/%cado* 6bu%ld$*4
7??
? Con&%erte una /%la de un Cursor en un nue&o Contacto ? ? para, c cursor ? return obeto contacto ?7 pr%&ate Contacto deCursorAContacto$Cursor c* > return ne Contacto$ c6etStr%n$ConsultaContactos6ID_CONTACTO*+
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 99/113
c6etStr%n$ConsultaContactos6PRIMER_NOMRE*+ c6etStr%n$ConsultaContactos6PRIMER_APE!!IDO*+ c6etStr%n$ConsultaContactos6TE!E"ONO*+ c6etStr%n$ConsultaContactos6CORREO*+ c6etStr%n$ConsultaContactos6VERSION*+ c6etInt$ConsultaContactos6MODI"ICADO*
*4
"a resuesta de la etici&n 1ET es rocesada con el método tratar1et$*, donde usamos el Procesador!ocal / lue*o alicar loscambios a través de ContentResol&er6appl8atc$*!
<or otro lado, los errores uedes tratarlos en otro método diferente como el 'ue /o nombré en el c&di*o anterior CtratarErrores$*D!Recuerda 'ue la resuesta de un error trae consi*o un ob#eto Json 'ue contiene un atributo 'estado' / un ',ensae'!
;as)ndome en eso, creé una clase e'ue.a 'ue reresente esa resuesta ara tener un arsin* con 3son, llamada RespuestaAp%!
publ%c class RespuestaAp% > pr%&ate %nt estado4 pr%&ate Str%n ,ensae4
publ%c RespuestaAp%$%nt code+ Str%n bod8* > t%s6estado 2 code4 t%s6,ensae 2 bod84
publ%c RespuestaAp%$* >
publ%c %nt etEstado$* > return estado4
publ%c Str%n etMensae$* >
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 100/113
return ,ensae4
O&err%de publ%c Str%n toStr%n$* > return 5$5 [ etEstado$* [ 5*B 5 [ etMensae$*4
+on esta uedes leer el error de la si*uiente forma9
pr%&ate &o%d tratarErrores$Volle8Error error* > 77 Crear respuesta de error por de/ecto RespuestaAp% respuesta 2 ne RespuestaAp%$ESTADO_PETICION_"A!!IDA+ 5Pet%c%n %ncorrecta5*4
77 Ver%/%cac%nB !a respuesta t%ene conten%do %nterpretable:
%/ $error6netorZResponse 2 null* >
Str%n s 2 ne Str%n$error6netorZResponse6data*4 tr8 > respuesta 2 son6/ro,son$s+ RespuestaAp%6class*4 catc $sonS8nta=E=cept%on e* > !o6d$TA1+ 5Error de pars%nB 5 [ s*4
%/ $error %nstanceo/ NetorZError* > respuesta 2 ne RespuestaAp%$ESTADO_TIEMPO_ESPERA + 5Error en la cone=%n6 Intentalo de nue&o5*4
77 Error de espera al ser&%dor %/ $error %nstanceo/ T%,eoutError* > respuesta 2 ne RespuestaAp%$ESTADO_TIEMPO_ESPERA+ 5Error de espera del ser&%dor5*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 101/113
77 Error de pars%n %/ $error %nstanceo/ ParseError* > respuesta 2 ne RespuestaAp%$ESTADO_ERROR_PARSIN1+ 5!a respuesta no es /or,ato SON5*4
77 Error cone=%n ser&%dor
%/ $error %nstanceo/ Ser&erError* > respuesta 2 ne RespuestaAp%$ESTADO_ERROR_SERVIDOR+ 5Error en el ser&%dor5*4
%/ $error %nstanceo/ NoConnect%onError* > respuesta 2 ne RespuestaAp%$ESTADO_ERROR_SERVIDOR + 5Ser&%dor no d%spon%ble+ prueba ,as tarde5*4
!o6d$TA1+ 5Error RespuestaB5 [ $respuesta 2 null : respuesta6toStr%n$* B 5$*5* [ 5^nDetallesB5 [ error6etMessae$**4
en&%arroadcast$/alse+ respuesta6etMensae$**4
En este momento /a es osible sincroni%ar localmente nuestra a! <ara robarlo, a*re*a dos nuevos re*istros en la base de datos/s'l / resiona el bot&n de sincroni%ar! -eberían de coiarse ambos re*istros en la alicaci&n $ndroid!
"ue*o rueba editar los re*istros del servidor / vuelve a sincroni%ar! También rueba la eliminaci&n ara ver si se relica!
;! Sincroni$ar base de datos )2s"l del servidor
"a sincroni%aci&n del servidor la iniciaré al final de la sincroni%aci&n local! +uando esta termine, entonces notificaré al usuario de 'ueeste roceso culmin& con satisfacci&n!
$(ora el roblema es encontrar la forma de recolectar todos los re*istros de la base de datos 'ue estén marcados como insertados,modificados / eliminados! "ue*o arsearlos a JS67 / enviarlos en la etici&n con la forma 'ue re'uiere el método post$* en elarc(ivo s2nc!p7p!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 102/113
"a soluci&n la encontrar)s en la creaci&n de la clase ProcesadorRe,oto, la cual es tiene naturale%a similar a Procesador!ocal! Estave% (aremos el roceso inverso, obteniendo cada una de las oeraciones remotas ara a*ruarlas en un ob#eto JS67!
;)sate en esta serie de asos ara conse*uir las oeraciones9
1! sa el método ContentResol&er6;uer8$* ara etraer re*istros marcados! <or e#emlo, los contactos insertados se consi*uen conla condici&n '3ERE %nsertado 2 0'!2! tera sobre el cursor con un %le / maea cada fila como un Map! Esto ermitir) reali%ar f)cilmente el arsin* con 3son!G! $*re*a el maeado a una lista!I! Retorna en la lista si esta tiene uno o m)s elementos!
Paso #! $sí 'ue crea una nueva clase dentro del a'uete s2nc llamada ProcesadorRe,oto / a*re*a el si*uiente c&di*o!
Procesador#emoto.java
publ%c class ProcesadorRe,oto > pr%&ate stat%c /%nal Str%n TA1 2 ProcesadorRe,oto6class6etS%,pleNa,e$*4
77 Ca,pos SON pr%&ate stat%c /%nal Str%n INSERCIONES 2 5%nserc%ones54 pr%&ate stat%c /%nal Str%n MODI"ICACIONES 2 5,od%/%cac%ones54 pr%&ate stat%c /%nal Str%n E!IMINACIONES 2 5el%,%nac%ones54
pr%&ate 1son son 2 ne 1son$*4
pr%&ate %nter/ace ConsultaContactos >
77 Pro8ecc%n para consulta de contactos Str%nJK PRO]ECCION 2 > Contactos6ID_CONTACTO+ Contactos6PRIMER_NOMRE+ Contactos6PRIMER_APE!!IDO+ Contactos6TE!E"ONO+ Contactos6CORREO+ Contactos6VERSION
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 103/113
4
publ%c Str%n crearPa8load$ContentResol&er cr* > 3asMap9Str%n+ ObectF pa8load 2 ne 3asMap9F$*4
!%st9Map9Str%n+ ObectFF %nserc%ones 2 obtenerInserc%ones$cr*4 !%st9Map9Str%n+ ObectFF ,od%/%cac%ones 2 obtenerMod%/%cac%ones$cr*4 !%st9Str%nF el%,%nac%ones 2 obtenerEl%,%nac%ones$cr*4
77 Ver%/%cac%nB 3a8 ca,b%os locales: %/ $%nserc%ones 22 null WW ,od%/%cac%ones 22 null WW el%,%nac%ones 22 null* > return null4
pa8load6put$INSERCIONES+ %nserc%ones*4 pa8load6put$MODI"ICACIONES+ ,od%/%cac%ones*4
pa8load6put$E!IMINACIONES+ el%,%nac%ones*4
return son6toson$pa8load*4
publ%c !%st9Map9Str%n+ ObectFF obtenerInserc%ones$ContentResol&er cr* > !%st9Map9Str%n+ ObectFF ops 2 ne Arra8!%st9F$*4
77 Obtener contactos donde '%nsertado' 2 0 Cursor c 2 cr6;uer8$Contactos6URI_CONTENIDO+ ConsultaContactos6PRO]ECCION+ Contactos6INSERTADO [ 52:5+
ne Str%nJK>505+ null*4
77 Co,probar s% a8 trabao ;ue real%ar %/ $c 2 null WW c6etCount$* F .* >
!o6d$TA1+ 5Inserc%ones re,otasB 5 [ c6etCount$**4
77 Procesar %nserc%ones
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 104/113
%le $c6,o&eToNe=t$** > ops6add$,apearInserc%on$c**4
return ops4
else > return null4
publ%c !%st9Map9Str%n+ ObectFF obtenerMod%/%cac%ones$ContentResol&er cr* >
!%st9Map9Str%n+ ObectFF ops 2 ne Arra8!%st9F$*4
77 Obtener contactos donde ',od%/%cado' 2 0 Cursor c 2 cr6;uer8$Contactos6URI_CONTENIDO+
ConsultaContactos6PRO]ECCION+ Contactos6MODI"ICADO [ 52:5+ ne Str%nJK>505+ null*4
77 Co,probar s% a8 trabao ;ue real%ar %/ $c 2 null WW c6etCount$* F .* >
!o6d$TA1+ 5E=%sten 5 [ c6etCount$* [ 5 ,od%/%cac%ones de contactos5*4
77 Procesar operac%ones %le $c6,o&eToNe=t$** > ops6add$,apearActual%ac%on$c**4
return ops4
else > return null4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 105/113
publ%c !%st9Str%nF obtenerEl%,%nac%ones$ContentResol&er cr* >
!%st9Str%nF ops 2 ne Arra8!%st9F$*4
77 Obtener contactos donde 'el%,%nado' 2 0 Cursor c 2 cr6;uer8$Contactos6URI_CONTENIDO+ ConsultaContactos6PRO]ECCION+ Contactos6E!IMINADO [ 52:5+ ne Str%nJK>505+ null*4
77 Co,probar s% a8 trabao ;ue real%ar %/ $c 2 null WW c6etCount$* F .* >
!o6d$TA1+ 5E=%sten 5 [ c6etCount$* [ 5 el%,%nac%ones de contactos5*4
77 Procesar operac%ones
%le $c6,o&eToNe=t$** > ops6add$UConsultas6obtenerStr%n$c+ Contactos6ID_CONTACTO**4
return ops4
else > return null4
7?? ? Des,arca los contactos locales ;ue 8a an s%do s%ncron%ados ? ? para, cr content resol&er ?7 publ%c &o%d des,arcarContactos$ContentResol&er cr* > 77 Establecer &alores de la actual%ac%n
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 106/113
ContentValues &alores 2 ne ContentValues$*4 &alores6put$Contactos6INSERTADO+ .*4 &alores6put$Contactos6MODI"ICADO+ .*4
Str%n selecc%on 2 Contactos6INSERTADO [ 5 2 : OR 5 [ Contactos6MODI"ICADO [ 52 :54
Str%nJK aru,entos 2 >505+ 5054
77 Mod%/%car banderas de %nsertados 8 ,od%/%cados cr6update$Contactos6URI_CONTENIDO+ &alores+ selecc%on+ aru,entos*4
selecc%on 2 Contactos6E!IMINADO [ 52:54 77 El%,%nar de/%n%t%&a,ente cr6delete$Contactos6URI_CONTENIDO+ selecc%on+ ne Str%nJK>505*4
pr%&ate Map9Str%n+ ObectF ,apearInserc%on$Cursor c* >
77 Nue&o ,apa para re/learlo en SON Map9Str%n+ ObectF ,apaContacto 2 ne 3asMap9Str%n+ ObectF$*4
77 A@ad%r &alores de colu,nas co,o atr%butos UDatos6arearStr%nAMapa$,apaContacto+ Contactos6ID_CONTACTO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6PRIMER_NOMRE+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6PRIMER_APE!!IDO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6TE!E"ONO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6CORREO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6VERSION+ c*4
return ,apaContacto4
pr%&ate Map9Str%n+ ObectF ,apearActual%ac%on$Cursor c* > 77 Nue&o ,apa para re/learlo en SON Map9Str%n+ ObectF ,apaContacto 2 ne 3asMap9Str%n+ ObectF$*4
77 A@ad%r &alores de colu,nas co,o atr%butos UDatos6arearStr%nAMapa$,apaContacto+ Contactos6ID_CONTACTO+ c*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 107/113
UDatos6arearStr%nAMapa$,apaContacto+ Contactos6PRIMER_NOMRE+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6PRIMER_APE!!IDO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6TE!E"ONO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6CORREO+ c*4 UDatos6arearStr%nAMapa$,apaContacto+ Contactos6VERSION+ c*4
return ,apaContacto4
7ota 'ue el método crearPa8load$* acumula los resultados de las tres oeraciones en un solo maa 'ue ser) enviado en con elmétodo post$* de la clase RESTSer&%ce!
$dicionalmente tenemos un método llamado des,arcarContactos$* cu/a funci&n es oner en 0 las banderas de todos los re*istrossincroni%ados! +on ello evito 'ue se envíen a otra oeraci&n sin tener nada 'ue ver!
Paso #-! Envía la etici&n POST #usto al final de las acciones del método s8nc!ocal$*! <on el resultado del método crearPa8load$* de una instancia del rocesador remoto, como se*undo ar)metro del método post$*!
pr%&ate &o%d s8ncRe,ota$* > procRe,oto 2 ne ProcesadorRe,oto$*4
77 Constru%r pa8load con todas las operac%ones re,otas pend%entes Str%n datos 2 procRe,oto6crearPa8load$cr*4
%/ $datos 2 null* > !o6d$TA1+ 5Pa8load de contactosB5 [ datos*4
3asMap9Str%n+ Str%nF cabeceras 2 ne 3asMap9F$*4 cabeceras6put$5Autor%at%on5+ UPre/erenc%as6obtenerCla&eAp%$etConte=t$***4
ne RESTSer&%ce$etConte=t$**6post$UR!_S]NC_ATC3+ datos+ ne Response6!%stener9SONObectF$* > O&err%de publ%c &o%d onResponse$SONObect response* > tratarPost$*4
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 108/113
+ ne Response6Error!%stener$* > O&err%de publ%c &o%d onErrorResponse$Volle8Error error* > tratarErrores$error*4
+ cabeceras*4 else > !o6d$TA1+ 5S%n ca,b%os locales5*4 en&%arroadcast$true+ 5S%ncron%ac%n co,pleta5*4
$l recibir una resuesta eitosa del servidor desmarca los edidos, de lo contrario rocesa los errores con tratarErrores$*!
pr%&ate &o%d tratarPost$* > 77 Des,arcar %nserc%ones locales procRe,oto6des,arcarContactos$cr*4
;!G =oti.icar estados de sincroni$ación con Snac@1ars
Si e#ecutas la a (asta el momento, disfrutar)s de la sincroni%aci&n local / remota! El /ocat te mostrar) los sucesos 'ue va/anocurriendo en la etici&n BTT<, el arsin* JS67 / las oeraciones en el ContentPro&%der!
@ #ero qué hay del usuario)
@ #C'mo sabr3 el que la sincroni&aci'n termin' o fall')
Eisten varios elementos visuales 'ue odrían a/udarte, tales como los Toasts, SnacM;ars, notificaciones, barras de ro*reso oindicadores ersonali%ados en los views! Ba/ *ran variedad ara esco*er!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 109/113
En mi caso (aré 'ue las snacM bars soorten mis avisos!
El roblema de notificar estados es 'ue no sabemos en 'ué momento ir)n a terminar las acciones en el bacM*round 'ue e#ecuta elS8ncAdapter! "o 'ue no ermite e#ecutar acciones de forma secuencial!
<ero no te reocues! "a soluci&n la (allar)s en un comonente llamado "ocal;roadcastana*er ! Este se encar*a de enviar intentsentre los comonentes locales de tu a, como lo es la comunicaci&n entre el s/nc adater / la actividad contactos!
<ara comen%ar a enviar notificaciones solo si*ue estos asos9
! +rea una nueva clase 'ue etienda de roadCastRece%&er dentro de la actividad o comonente 'ue recibir) mensa#es! -ictaminalas acciones 'ue se e#ecutar)n al recibir el mensa#e dentro de onRece%&e$*!-! Re*istra el receiver con el método re%sterRece%&er$* del !ocalroadcastManaer! Este re*istro re'uiere un filtroIntent"%lter 'ue esecifi'ue todas las acciones de las 'ue estar) endiente el recetor!0! -esre*istralo en un lu*ar donde no sea necesario recibir las notificaciones con !ocalroadcastManaer6unre%sterRece%&er$* !5! inalmente envía mensa#es desde otro comonente con el método !ocalroadcastManaer6sendroadcast$* , instanciandointents con la acci&n ob#etivo / a.adiendo ar*umentos 'ue re'uieran rocesarse en el recetor!
:eamos.
Paso #! $bre Act%&%dad!%staContactos / a*re*a una nueva clase an&nima del tio roadcastRece%&er, dentro de onCreate$*!"ue*o sobrescsribe onRece%&e$* ara 'ue rodu%ca una SnacZbar con el mensa#e de teto 'ue vendr) desde otros comonentes!
pr%&ate roadcastRece%&er receptorS8nc4
O&err%deprotected &o%d onCreate$undle sa&edInstanceState* > 77 MGs cd%o666
receptorS8nc 2 ne roadcastRece%&er$* >
O&err%de publ%c &o%d onRece%&e$Conte=t conte=t+ Intent %ntent* >
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 110/113
Str%n ,ensae 2 %ntent6etStr%nE=tra$5e=tra6,ensae5*4 SnacZbar6,aZe$/%ndV%e8Id$R6%d6coord%nador*+ ,ensae+ SnacZbar6!EN1T3_!ON1*6so$*4 4
Paso #-! Re*istra el receiver en el método onResu,e$* de la actividad con un filtro del tio Intent6ACTION_S]NC de la si*uienteforma9
O&err%deprotected &o%d onResu,e$* > super6onResu,e$*4 77 Re%strar receptor Intent"%lter /%ltroS8nc 2 ne Intent"%lter$Intent6ACTION_S]NC*4 !ocalroadcastManaer6etInstance$t%s*6re%sterRece%&er$receptorS8nc+ /%ltroS8nc*4
+abe aclarar 'ue ACTION_S]NC es solo una constante de la clase ntent ara esecificar acciones de sincroni%aci&n, sin embar*o uedescrear tu roia constante ara determinar la acci&n!
Paso #0! El desre*istro uedes (acerlo en el método onPause$*, /a 'ue no es de utilidad recibir mensa#es cuando la actividad est)siendo sueruesta or otro comonente / muc(o menos cuando est) en se*undo lano!
O&err%deprotected &o%d onPause$* > super6onPause$*4
77 Desre%strar receptor !ocalroadcastManaer6etInstance$t%s*6unre%sterRece%&er$receptorS8nc*4
Paso #5! $bre tu s/nc adater / envía intents desde el método tratarErrores$*! También uedes (acerlo al terminar lasincroni%aci&n comleta en tratarPost$*!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 111/113
or ejemplo!
pr%&ate &o%d en&%arroadcast$boolean estado+ Str%n ,ensae* > Intent %ntent!ocal 2 ne Intent$Intent6ACTION_S]NC*4 %ntent!ocal6putE=tra$E#TRA_RESU!TADO+ estado*4 %ntent!ocal6putE=tra$E#TRA_MENSAE+ ,ensae*4 !ocalroadcastManaer6etInstance$etConte=t$**6sendroadcast$%ntent!ocal*4
pr%&ate &o%d tratarPost$* > 77 Des,arcar %nserc%ones locales procRe,oto6des,arcarContactos$cr*4 en&%arroadcast$true+ 5S%ncron%ac%n co,pleta5*4
El c&di*o anterior envía un intent con el mensa#e “Sincroni$ación completa” en caso de 'ue la sincroni%aci&n termine de formasatisfactoria! Recuerda enviar el mensa#e con !ocalroadcastManaer6sendroadcast$* !
Si ercibes 'ue tus mensa#es no se reciben, intenta revisar 'ue las acciones de los intents coincidan!
$l e#ecutar la a con todos los untos de envío de mensa#es, odr)s ver las snacM bars de la si*uiente forma!
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 112/113
7/23/2019 Consumir Un Servicio Web REST Desde Android
http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 113/113
Conclusión
"os servicios REST son mu/ ?tiles ara or*ani%ar tus r)cticas de intercambio de datos entre alicaciones! #?otaste la gran diferencia
entre el uso de U@s para locali&ar recursos, en ve& de enviar peticiones sin forma, hacia m(ltiples archivos hp)
Recuerda 'ue cada alicaci&n demanda un conceto diferente de sincroni%aci&n de datos deendiendo del modelo de ne*ocio ocaracterísticas del servicio 'ue reste tu a a los usuarios! En mi caso, el e#emlo de <eole$ uede funcionar sin conei&n ainternet / ermite al usuario ele*ir en 'ue momento sincroni%ar sus datos!
+abe adicionar la imortancia de las oeraciones en batc( en el servicio web ara 'ue tu alicaci&n envíe ocas eticiones BTT< (aciael servidor! +on este enfo'ue, es osible otimi%ar la batería del disositivo m&vil al momento de sincroni%ar!
<or ?ltimo, te recomiendo investi*ar mu/ bien tus re'uerimientos de sincroni%aci&n / las estrate*ias 'ue alicar)s! Estos factores sonfundamentales ara ele*ir el rumbo de desarrollo 'ue tomar) tu ro/ecto / rote*er la informaci&n de cada usuario!