Cómo manejar llamadas REST, persistencia de datos, sincronización y observación de ContentProvider

Sé que esta pregunta se ha hecho demasiadas veces, pero creo que los problemas que intento apuntar son un poco diferentes, quizás más complicados.

Voy a desarrollar una aplicación que utiliza un servicio Web RESTful y necesita tener los siguientes requisitos:

  • La aplicación debe mostrar algunos libros, sus autores y sus editores en las listas y en detalle

  • La aplicación también debe permitir la búsqueda de un libro

  • Libros, autores y editores se obtienen de un servicio web RESTful

  • Cada entidad tiene que ser almacenada en caché para que cuando abro una Actividad vea los datos antiguos primero (si los hay), mientras que el nuevo se actualiza desde la red.

  • Cada vez que una entidad se está actualizando, las partes interesadas deben ser notificadas ( ContentObserver ?

  • Si ya se está ejecutando una llamada (por ejemplo, api/books/1337 o api/editors ), se debe notificar a la persona que llama que está cargando datos y se le debe dar la antigua (si existe), como si fuera la llamada original .

  • Algunos datos (sólo libros y autores) deben ser actualizados cada N minutos (decidido por el usuario) y los observadores deben ser notificados ( SyncAdapter ?)

Preguntas :

Después de ver y estudiar todos los componentes propuestos por Virgil Dobjanschi en Google I / O 2010 aquí están mis dudas:

  1. ¿Cómo puedo manejar de forma transparente el concepto de " entidad-está-actualizando " para cualquier persona que llama? ¿Debería usar ContentObserver en un ContentProvider que tendré que implementar?

  2. Si utilizo un ContentObserver , puedo establecer fácilmente un indicador de estado para la entidad única (como sugiere Dobjanschi), por ejemplo UPDATING , INSERTING , etc. ¿Pero cómo debo manejar la lista? Diga que quiero una lista de libros, ¿dónde debo colocar la bandera de estado? ¿Debería ponerlo en una tabla de estado sólo para listas? Si es así, debería observar dos Cursor , uno para el estado y otro para la lista actual (es decir, la tabla / URI de Contenido). ¿Y si la entidad que estoy pidiendo no existe (aún) o la llamada REST devuelve un 404 ? ¿Cómo puedo manejar la devolución de llamada?

  3. Si pongo todos mis métodos REST en un **SyncAdapter** , ¿puedo "forzar" a SyncAdapter a actualizar una lista entidad / entidad de la red (y por lo tanto ponerla en la tabla correcta)? De esta manera, el indicador de estado sería útil.

  4. ¿Puede SyncAdapter trabajar en múltiples entidades (en realidad, listas de entidad, como quiero actualizar libros y editores de vez en cuando), ya que sólo tiene un método performSync ?

  5. Si mi implementación SyncAdapter ha sido deshabilitada por el usuario en la configuración del dispositivo, no se actualizará nada (y eso está bien). Pero si el usuario hace clic en un botón "actualizar libros" en una actividad, ¿puedo seguir llamando al método performSync o también se deshabilitará?

SyncAdapter es un patrón de diseño que involucra cinco componentes:

  1. Una aplicación. Esto utiliza un conjunto de Activity junto con Cursor y ContentObserver y tal vez CursorAdapter y algunos para proporcionar una interfaz de usuario a los datos almacenados localmente de un ContentProvider .
  2. ContentProvider Almacén de datos del dispositivo local. Maneja CRUD llamadas, se encarga de notificar SyncAdapter de la necesidad de empujar una actualización para el servidor.
  3. Account La identidad del usuario en el servidor remoto.
  4. SyncAdapter Proceso en segundo plano que se ejecuta y mantiene el almacén de datos local en sincronización con el servidor.
  5. El propio servidor.

Asi que. A las preguntas:

  1. "Is-updating" significa que "tiene cambios locales que aún no han sido enviados al servidor.Es un indicador que se establece en una fila en su base de datos.Se establece en ContentProvider cuando se crea / Actualizar / Eliminar una fila.Cuando SyncAdapter se ejecuta , Ve la bandera, empuja la actualización al servidor, borra la bandera La bandera en sí hace dos cosas:
    a. Indica al usuario que la aplicación está ocupada guardando el cambio y cuando se hace.
    segundo. Marca la fila como se ha cambiado, de modo que SyncAdapter sabe empujarla al servidor.
    Lea aquí para más detalles.

  2. Si no está sincronizando todo el catálogo, el cliente consultará directamente al servidor y almacenará los resultados en caché poniéndolos en el ContentProvider. No hay ninguna bandera de estado allí, ya que vienen del servidor y por lo tanto coinciden con el estado del servidor. Escriba su SyncAdapter para ignorarlos, o tal vez descartarlos después de haberlos almacenado en caché unos días.

  3. a. Para asegurarse de que las actualizaciones locales se envían al servidor, escriba su ContentProvider para notificar al SyncAdapter durante las llamadas Create / Update / Delete de ContentProvider. (Leer aquí…)
    segundo. Para asegurarse de que recibe actualizaciones del servidor periódicamente, configura la cuenta para la sincronización automática. (Leer aquí…)

  4. Sí. PerformSync es sólo una llamada de función. Escríbelo para hacer lo que quiera. Pídale que traiga la tabla 1 del servidor y la coloque en una tabla en su ContentProvider. Luego haga que busque la tabla 2, y póngala en una tabla diferente. Etc.

  5. a. Puede forzar una sincronización llamando ContentResolver.RequestSync() con ContentResolver.SYNC_EXTRAS_MANUAL en el paquete de extras.
    segundo. Puede buscar algo manualmente con el código de cliente y empujarlo directamente al ContentProvider.

Si echa un vistazo a la sección Running Sync Adapter en Google Developers Training , encontrará una descripción detallada de cómo:

  1. Ejecutar el adaptador de sincronización cuando los cambios de datos de servidor
  2. Ejecute el adaptador de sincronización cuando cambia datos de proveedor de contenido
  3. Ejecutar el adaptador de sincronización después de un mensaje de red
  4. Ejecute el adaptador de sincronización periódicamente
  5. Ejecute el adaptador de sincronización bajo demanda
  • Observador de contenido de Android History
  • ¿Diferencia entre ContentObserver y DatasetObserver?
  • Android: ¿Cómo registrar un observador de contenido sin actividad?
  • ContentObserver se llama incluso cuando no hay cambios en el cursor
  • Cómo detectar nuevas aplicaciones en un dispositivo Android
  • Sms ContentObserver onChange () se activa varias veces
  • ContentObserver vs BroadCastReceiver: Uso de la batería, RAM, CPU?
  • Bloquear SMS salientes por contentObserver
  • Aplicación de copia de seguridad y sincronización de contactos
  • ¿Cómo hago que mi Android ContentObserver para ContactsContract detecte un contacto añadido, actualizado o eliminado?
  • Android: observador de contenido para contenido: // sms / enviado no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.