¿Cómo manejas los registros de antememoria de caché en la aplicación para móviles

Estoy en el proceso de crear una aplicación para Android (mi primera) que consume una API REST. Utilizo un trabajo de fondo para buscar contenido y planeo usar una solicitud GET con un parámetro from_id para obtener más contenido. Por supuesto cualquier cosa obtenida de la API se almacena en el SQLite db (estoy usando greendao) y la aplicación sólo utiliza los datos que ya están presentes allí, con el fin de ser ágil.

Por lo tanto, la pregunta es: ¿Qué sucede si un registro determinado se actualiza en el servidor? Si los registros una vez leídos se almacenan en caché, ¿por qué la aplicación se dará cuenta de que hay cambios en la sincronización? ¿Qué estrategias son soluciones factibles?

Gracias.

EDITAR:

Como señala Satish P en su respuesta, la comunicación cliente-servidor se maneja con ETag (y debo agregar la posibilidad de usar If-Modified-Since).

Pero mi principal preocupación, es cómo mezclar esto con la aplicación de interfaz de usuario. Dado este ejemplo:

  1. Se lee una lista de elementos que se han recuperado del servicio REST, pero del lado del cliente, de la base de datos local para que la aplicación sea más sensible.
  2. El usuario hace clic en uno de esos elementos y se muestra una vista detallada. Nuevamente, los datos se cargan desde la base de datos local. Supongo que en este punto se solicita una solicitud GET para el registro específico, ya sea con cabeceras ETag o If-Modified-Since.
  3. Sucede que el servidor devuelve un registro modificado, por lo que los datos locales se modifican, por lo que ahora es el momento de actualizar lo que el usuario está viendo.

Problema: Si la vista detallada ya está poblada porque la lectura de la base de datos local ya se hizo cuando se devuelve la solicitud remota, ¿cómo puedo actualizar la vista? No creo que sólo la sustitución de los datos actuales por el más fresco es aceptable, el usuario vería un cambio de la nada.

La respuesta de Satish es absolutamente correcta en términos de lo que necesita su servidor para hacer. La esencia es que necesita para apoyar ETags y 304 códigos de respuesta en caso de que el contenido no ha cambiado desde la última vez que lo recibió desde el servidor. En el lado del cliente ahora, hay esencialmente tres estrategias que puedes seguir (cada una con sus propios pros y sus contras):

  1. Sólo utilice la caché si el contenido no ha cambiado. Esto significa que siempre hará una solicitud y mostrará una barra de progreso al usuario. Si el servidor devuelve 304, entonces su contenido no ha cambiado y la solicitud será bastante rápida (en el momento en que vea, muestra el contenido en caché). Si el servidor realmente devuelve nuevo contenido, sigue mostrando la barra de progreso y cuando se carga el contenido se muestra el nuevo contenido. Lo bueno de esto es que el usuario sólo verá contenido válido, evitando así muchos dolores de cabeza de su parte. Lo malo es que la aplicación no aparece tan rápido (especialmente si el contenido ha cambiado y usted está en una conexión muy lenta).
  2. Utilice sólo la memoria caché durante un período predefinido y luego vuelva al primer caso. Hay un par de cabecera de caché para definir ese período ('max-edad' y 'caduca'). Antes de ese período siempre se utiliza la caché (sin hacer una solicitud), y después de hacer una solicitud y ver si el contenido ha cambiado. Lo bueno de este método es que durante el período mencionado anteriormente, la aplicación es muy rápido. Lo malo es que existe la posibilidad de que el usuario esté buscando contenido incorrecto.
  3. Utilice el caché y la red durante un período predefinido y, a continuación, vuelva al primer caso. Puede utilizar los encabezados de caché mencionados anteriormente de una manera diferente. En lugar de mostrar sólo el contenido en caché, puede mostrar el contenido en caché Y hacer una solicitud en segundo plano. Si esa petición vuelve con un 304, bien, de lo contrario tendrá que actualizar la interfaz de usuario con los nuevos datos (esperar dos respuestas, una con los datos en caché y otra con los datos recuperados recientemente). El positivo con esto es que usted consigue una experiencia rápida y datos válidos (la mayor parte del tiempo). Lo negativo es que agregas mucha complejidad a tu aplicación (lo que sucede si el usuario interactúa con los datos obsoletos, y luego aparece una segunda respuesta, etc.).

En conjunto, cada estrategia es válida dependiendo del caso de uso. Por ejemplo, si el usuario no puede interactuar con la pantalla que muestra los datos (como un programa de televisión), la tercera opción es bastante buena. Si es crucial que el usuario ve los datos correctos (una aplicación financiera, digamos), entonces la primera opción es la mejor. Si la velocidad es más importante que tener los últimos datos (un juego o algo), entonces la segunda opción es su mejor opción.

La eficacia del cliente para realizar el almacenamiento en caché depende únicamente de la cantidad de apoyo que recibe de la API REST a la que accede su cliente.

Utilizar ETag es el estándar de la industria para hacer que el almacenamiento en caché en el lado del cliente sea más eficiente y también el servidor sirva la solicitud más rápidamente. En breve ETag es COMO un hash MD5 del contenido devuelto. Más sobre ETag aquí: http://en.wikipedia.org/wiki/HTTP_ETag

Si se trata de una API popular como Google, Facebook, etc, que inherentemente soporte ETags. Por favor, mira los siguientes enlaces:

El uso de ETag se explica mejor aquí: https://developers.facebook.com/docs/reference/ads-api/etags-reference

  • Cuando el cliente hace un GET en un recurso en particular, el servidor al responder con el contenido debe incluir un ETag.
  • El cliente debe almacenar el ETag para ese recurso contra los datos almacenados en caché.
  • Cada vez que el cliente está utilizando la información de caché, debe verificar la caché utilizando el ETag. Puede trabajar de múltiples maneras dependiendo de la implementación del servicio de nuevo
    • Hacer un GET habitual en el recurso e incluir el ETag como parte de la solicitud. Si el contenido no cambia el servicio idealmente no devolverá ningún dato, sino que le dará un código específico como (304 – Not Modified). El cliente sabe que la caché sigue siendo válida y continúa usándola
    • Hacer una llamada HEAD en el recurso y el ETag se devuelve. Es parte de la Especificación HTTP estándar. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html (Consultar 9.4). En este caso, el Cliente verificará el ETag y decidirá si realizar o no la llamada GET.

Ejemplo de un recurso en la explicación anterior es como a continuación

GET http://serverapi.com/employees/2312312312 

La actualización de la pantalla podría ser manejada con bastante gracia por Javascript, reescribiendo elementos específicos en el DOM – opcionalmente aplicando el formato CSS para llamar la atención sobre el cambio en la interfaz de usuario – si cada datum en la interfaz de usuario tiene un ID / Ser blanco de JS.

Una manera simple / istic para derrotar un caching es anexar una cadena de consulta al recurso que desea. Por ejemplo, un archivo denominado testfile.csv se puede acceder fácilmente a testfile.csv? 12345 – y la próxima vez que desee omitir la caché, sólo actualizar la cadena de consulta, por ejemplo, testfile.csv? 23456. Si actualizar manualmente una cadena de consulta es ardua en su contexto, obtenga un poco más inteligente a costa de un golpe modesto en rendimiento a través de PHP: llame al recurso como testfile.csv para que la cadena de consulta se actualice automáticamente en cada consulta después El recurso se modifica; La versión actualizada se sirve en lugar de la en caché.

  • SQLiteException cerca de "<" mientras se borra la consulta
  • Cómo comprobar si BLOB es nulo
  • Android - proveedores de contenido sqlite y multithreading
  • ¿Qué se puede hacer sobre el hecho de que Android elimina automáticamente los archivos corruptos de SQLite?
  • Cómo leer una columna específica de SQLiteBatabase existente en Android?
  • Agregar una columna a la tabla de SQLite en Android?
  • Android - SQLite Cursor getColumnIndex () es sensible a mayúsculas y minúsculas?
  • Consulta de suma en sqlite en android
  • Selección de un proyecto ORM para Android (nivel mínimo de API 7)
  • Obtener el resultado del cursor y convertirlo en una cadena para TextView
  • Cambiar la clave principal de una tabla en SQLite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.