Top Banner
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#emlo en $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*o estableceremos 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 a corta, 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 el artí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*!
113

Consumir Un Servicio Web REST Desde Android

Feb 17, 2018

Download

Documents

JL1206
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Consumir Un Servicio Web REST Desde Android

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*!

Page 2: Consumir Un Servicio Web REST Desde Android

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>

Page 3: Consumir Un Servicio Web REST Desde Android

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!

Page 4: Consumir Un Servicio Web REST Desde Android

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

Page 5: Consumir Un Servicio Web REST Desde Android

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 &timestamps' 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!

Page 6: Consumir Un Servicio Web REST Desde Android

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

Page 7: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 7/113

Page 8: Consumir Un Servicio Web REST Desde Android

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”!

Page 9: Consumir Un Servicio Web REST Desde Android

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

Page 10: Consumir Un Servicio Web REST Desde Android

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!

Page 11: Consumir Un Servicio Web REST Desde Android

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

Page 12: Consumir Un Servicio Web REST Desde Android

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*>

Page 13: Consumir Un Servicio Web REST Desde Android

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

Page 14: Consumir Un Servicio Web REST Desde Android

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

Page 15: Consumir Un Servicio Web REST Desde Android

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!

Page 16: Consumir Un Servicio Web REST Desde Android

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

Page 17: Consumir Un Servicio Web REST Desde Android

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

Page 18: Consumir Un Servicio Web REST Desde Android

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>

Page 19: Consumir Un Servicio Web REST Desde Android

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+

Page 20: Consumir Un Servicio Web REST Desde Android

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

Page 21: Consumir Un Servicio Web REST Desde Android

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

Page 22: Consumir Un Servicio Web REST Desde Android

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+

Page 23: Consumir Un Servicio Web REST Desde Android

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

Page 24: Consumir Un Servicio Web REST Desde Android

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!

Page 25: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 25/113

Page 26: Consumir Un Servicio Web REST Desde Android

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!

Page 27: Consumir Un Servicio Web REST Desde Android

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

Page 28: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 28/113

Page 29: Consumir Un Servicio Web REST Desde Android

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

Page 30: Consumir Un Servicio Web REST Desde Android

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

Page 31: Consumir Un Servicio Web REST Desde Android

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

Page 32: Consumir Un Servicio Web REST Desde Android

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

Page 33: Consumir Un Servicio Web REST Desde Android

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

Page 34: Consumir Un Servicio Web REST Desde Android

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??

Page 35: Consumir Un Servicio Web REST Desde Android

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!

Page 36: Consumir Un Servicio Web REST Desde Android

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

 

Page 37: Consumir Un Servicio Web REST Desde Android

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

Page 38: Consumir Un Servicio Web REST Desde Android

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!

Page 39: Consumir Un Servicio Web REST Desde Android

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

Page 40: Consumir Un Servicio Web REST Desde Android

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

Page 41: Consumir Un Servicio Web REST Desde Android

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 

Page 42: Consumir Un Servicio Web REST Desde Android

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

Page 43: Consumir Un Servicio Web REST Desde Android

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

Page 44: Consumir Un Servicio Web REST Desde Android

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&!

Page 45: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 45/113

Page 46: Consumir Un Servicio Web REST Desde Android

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 ;!:!

Page 47: Consumir Un Servicio Web REST Desde 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

Page 48: Consumir Un Servicio Web REST Desde Android

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 >

Page 49: Consumir Un Servicio Web REST Desde Android

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

Page 50: Consumir Un Servicio Web REST Desde Android

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 

Page 51: Consumir Un Servicio Web REST Desde Android

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>

Page 52: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 52/113

Page 53: Consumir Un Servicio Web REST Desde Android

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

Page 54: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 54/113

Page 55: Consumir Un Servicio Web REST Desde Android

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

Page 56: Consumir Un Servicio Web REST Desde Android

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

Page 57: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 57/113

Page 58: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 58/113

Page 59: Consumir Un Servicio Web REST Desde Android

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!

Page 60: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 60/113

Page 61: Consumir Un Servicio Web REST Desde Android

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

Page 62: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 62/113

Page 63: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 63/113

Page 64: Consumir Un Servicio Web REST Desde Android

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

Page 65: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 65/113

Page 66: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 66/113

Page 67: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 67/113

Page 68: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 68/113

Page 69: Consumir Un Servicio Web REST Desde Android

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

Page 70: Consumir Un Servicio Web REST Desde Android

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$*!

Page 71: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 71/113

Page 72: Consumir Un Servicio Web REST Desde Android

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

Page 73: Consumir Un Servicio Web REST Desde Android

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 

Page 74: Consumir Un Servicio Web REST Desde Android

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!

Page 75: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 75/113

Page 76: Consumir Un Servicio Web REST Desde Android

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!

Page 77: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 77/113

Page 78: Consumir Un Servicio Web REST Desde Android

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

Page 79: Consumir Un Servicio Web REST Desde Android

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!

Page 80: Consumir Un Servicio Web REST Desde Android

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** >

Page 81: Consumir Un Servicio Web REST Desde Android

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

Page 82: Consumir Un Servicio Web REST Desde Android

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$

Page 83: Consumir Un Servicio Web REST Desde Android

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!

Page 84: Consumir Un Servicio Web REST Desde Android

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!

Page 85: Consumir Un Servicio Web REST Desde Android

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+

Page 86: Consumir Un Servicio Web REST Desde Android

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 

Page 87: Consumir Un Servicio Web REST Desde Android

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

Page 88: Consumir Un Servicio Web REST Desde Android

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+

Page 89: Consumir Un Servicio Web REST Desde Android

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

Page 90: Consumir Un Servicio Web REST Desde Android

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!

Page 91: Consumir Un Servicio Web REST Desde Android

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

Page 92: Consumir Un Servicio Web REST Desde Android

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

Page 93: Consumir Un Servicio Web REST Desde Android

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

Page 94: Consumir Un Servicio Web REST Desde Android

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!

Page 95: Consumir Un Servicio Web REST Desde Android

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

Page 96: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 96/113

Page 97: Consumir Un Servicio Web REST Desde Android

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$** >

Page 98: Consumir Un Servicio Web REST Desde Android

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*+

Page 99: Consumir Un Servicio Web REST Desde Android

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$* >

Page 100: Consumir Un Servicio Web REST Desde Android

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 

Page 101: Consumir Un Servicio Web REST Desde Android

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!

Page 102: Consumir Un Servicio Web REST Desde Android

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

Page 103: Consumir Un Servicio Web REST Desde Android

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

Page 104: Consumir Un Servicio Web REST Desde Android

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 

Page 105: Consumir Un Servicio Web REST Desde Android

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

Page 106: Consumir Un Servicio Web REST Desde Android

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

Page 107: Consumir Un Servicio Web REST Desde Android

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

Page 108: Consumir Un Servicio Web REST Desde Android

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!

Page 109: Consumir Un Servicio Web REST Desde Android

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* >

Page 110: Consumir Un Servicio Web REST Desde Android

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$*!

Page 111: Consumir Un Servicio Web REST Desde Android

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!

Page 112: Consumir Un Servicio Web REST Desde Android

7/23/2019 Consumir Un Servicio Web REST Desde Android

http://slidepdf.com/reader/full/consumir-un-servicio-web-rest-desde-android 112/113

Page 113: Consumir Un Servicio Web REST Desde Android

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!