PDA

Ver la Versión Completa : Actualizar xml sólo si es necesario


androidtf
23/09/14, 16:28:38
Buenas,

mi aplicación usa un archivo xml descargado de un servidor. Me gustaría que cada vez que un usuario ejecuta la aplicación se compruebe si el archivo xml que está en el servidor es más actual que el que tiene el usuario en el dispositivo, para en ese caso descargarlo. ¿Cómo puedo comprobar que el archivo xml que está en el servidor es más actual sin descargarlo?

He intentado obtener la longitud del xml del servidor para compararla con el archivo local, pero al hacer

// xml online size
int fileOnlineSize = urlConnection.getContentLength();

me devuelve -1. Es decir que no se puede obtener el tamaño del archivo.

La cabecera del archivo es esta (resumiendo el archivo xml, ya que el real ocupa 800 kb):

<?xml version="1.0" encoding="utf-8"?>
<elements xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">

<item><title>Title1</title></item>
<item><title>Title2</title></item>

</elements>

Muchas gracias por vuestras respuestas.

mocelet
23/09/14, 17:01:58
Eso se hace con una cabecera de HTTP que se llama If-Modified-Since, que permite decirle al servidor que quieres cierto recurso (tu xml) pero solo si ha sido modificado desde el momento que digas (normalmente el tiempo que te dio el servidor la última vez que bajaste el xml). En ese caso, el servidor te devolverá o el clásico 200 OK con el fichero o una respuesta sin contenido del tipo 304 NOT MODIFIED.

En Android (HttpURLConnection) tienes los métodos getLastModified para cuando te hayas bajado un xml guardar ese valor. Luego tienes el setIfModifiedSince que pasándole ese valor hará que el servidor devuelva un código HTTP_OK si el fichero es nuevo (y lo procesas como siempre) o devuelva un código HTTP_NOT_MODIFIED (y entonces no haces nada).

androidtf
23/09/14, 22:03:59
OK! me puede valer, muchas gracias

rafaxplayer
05/10/14, 10:24:53
Me gustaria retomar el tema..
En mi caso se trata de un archivo ini el cual quiero saber si fue modificado , algún ejemplo practico de como hacer la tarea de comprobación?

mocelet
05/10/14, 10:30:47
Me gustaria retomar el tema..
En mi caso se trata de un archivo ini el cual quiero saber si fue modificado , algún ejemplo practico de como hacer la tarea de comprobación?

Igual que para el XML, el servidor solo mira si el fichero fue modificado desde la última vez.

Lo que no comprueba es el contenido, si se ha vuelto a guardar el fichero con los mismos datos, para el servidor es una modificación del fichero igualmente.

Otra opción es guardar en algún sitio el hash md5 del fichero y cada vez que el ini cambie actualizarlo. Así solo bajandote el hash en vez del fichero entero ya sabes si hubo cambios en el contenido.

rafaxplayer
06/10/14, 08:20:34
Bueno ya lo tengo , entre setmodifiedsince y getlastmodified hago la tarea de verificación , luego ini4j lib para parsear el ini y listo , gracias.