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:
- ContentObserver no funciona en android
- Android - Observer DB cambia con GreenDao ORM
- Android: el método "onChange ()" del observador de contenido se llama varias veces
- Cómo implementar un ContentObserver en un fragmento utilizando CursorAdapter y LoaderCallbacks?
- Contactos ContentObserver llamado aleatoriamente
-
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
oapi/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:
-
¿Cómo puedo manejar de forma transparente el concepto de " entidad-está-actualizando " para cualquier persona que llama? ¿Debería usar
ContentObserver
en unContentProvider
que tendré que implementar? -
Si utilizo un
ContentObserver
, puedo establecer fácilmente un indicador de estado para la entidad única (como sugiere Dobjanschi), por ejemploUPDATING
,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 dosCursor
, 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 un404
? ¿Cómo puedo manejar la devolución de llamada? -
Si pongo todos mis métodos REST en un
**SyncAdapter**
, ¿puedo "forzar" aSyncAdapter
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. -
¿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étodoperformSync
? -
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étodoperformSync
o también se deshabilitará?
- ¿Cómo utilizar ContentObserver con RecyclerView?
- Recibir cambios de contacto (agregados, eliminados y cambiados)
- Buscar contactos con la aplicación instalada
- ContentObserver para los cambios de contacto de escucha
- Observación de cambios en el observador de contenido android de Audio.Media.EXTERNAL_CONTENT_URI
- El método ContentObserver onChange () se llama muchas veces
- NotifyChange con uri modificado de contentProvider.update ()
- Por qué y cuándo anular el registro de observadores de contenido en android
SyncAdapter es un patrón de diseño que involucra cinco componentes:
- Una aplicación. Esto utiliza un conjunto de
Activity
junto conCursor
yContentObserver
y tal vezCursorAdapter
y algunos para proporcionar una interfaz de usuario a los datos almacenados localmente de unContentProvider
. -
ContentProvider
Almacén de datos del dispositivo local. Maneja CRUD llamadas, se encarga de notificarSyncAdapter
de la necesidad de empujar una actualización para el servidor. -
Account
La identidad del usuario en el servidor remoto. -
SyncAdapter
Proceso en segundo plano que se ejecuta y mantiene el almacén de datos local en sincronización con el servidor. - El propio servidor.
Asi que. A las preguntas:
-
"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. -
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.
-
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í…) -
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.
-
a. Puede forzar una sincronización llamando
ContentResolver.RequestSync()
conContentResolver.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:
- Ejecutar el adaptador de sincronización cuando los cambios de datos de servidor
- Ejecute el adaptador de sincronización cuando cambia datos de proveedor de contenido
- Ejecutar el adaptador de sincronización después de un mensaje de red
- Ejecute el adaptador de sincronización periódicamente
- Ejecute el adaptador de sincronización bajo demanda