Sincronizar cliente Android y servidor REST
Servidor REST
He creado un servidor Rails que contiene :users
y associated :comments
. Se utiliza como una API de backend para un cliente de Android. El formato de intercambio para cargar y almacenar datos en el servidor es JSON. Aquí están las migraciones relevantes.
class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.timestamps end end end
…
- ActionController InvalidAuthenticityToken en Api :: V1 :: UsersController # create
- Retrofit @Body apareciendo como parámetro en la petición HTTP
- Subida de imagen de Base64 VS ¿Subida de imagen binaria?
- Mover la aplicación web existente en una aplicación de teléfono nativa mediante un contenedor de navegador
- ¿Cómo crear un Api seguro de Rails REST para mi aplicación?
class CreateComments < ActiveRecord::Migration def change create_table :comments do |t| t.references :users t.string :subject t.text :message t.timestamps end end end
Todos los usuarios ya han sido importados. Por lo tanto, sólo está configurado el acceso de lectura para el recurso :users
. Por lo tanto, para :comments
debería ser posible agregar nuevas entradas. Aquí están las rutas disponibles.
user_comments GET /users/:user_id/comments(.:format) comments#index POST /users/:user_id/comments(.:format) comments#create new_user_comment GET /users/:user_id/comments/new(.:format) comments#new user_comment GET /users/:user_id/comments/:id(.:format) comments#show users GET /users(.:format) users#index user GET /users/:id(.:format) users#show
Cliente de Android
En el lado del cliente uso un Service
con AsyncTasks
para descargar, analizar y almacenar usuarios en una base de datos SQLite local. Un ContentProvider
entrega los usuarios en caché a la interfaz de usuario. El objeto de usuario descargado desde el servidor contiene el identificador único de la tabla de users
. Esto debería ser útil cuando se crea un nuevo comentario en el cliente.
Escenario 1: Leer comentarios
- Los usuarios se muestran en una vista de lista en el cliente de Android.
- Se selecciona un elemento de usuario.
- La actividad de lista crea un
Intent
que contiene el URI específico del usuario, por ejemplo,content://com.example.myapp.provider/users/23
. - Una actividad de usuario muestra información detallada sobre el usuario y los comentarios asociados.
- Los comentarios en caché se cargan a través de un
CursorLoader
. (1) - Un proceso de sincronización carga comentarios desde el servidor remoto. (2)
Escenario 2: Escribir comentarios
- Se puede crear un comentario a partir de la actividad del usuario.
- El comentario se almacena en la base de datos local. (3)
- Los comentarios almacenados se sincronizan con el servidor remoto. (2)
Preguntas sobre el dolor de cabeza
Marcé los pasos del escenario que están asociados con las siguientes preguntas.
- ¿Cómo puedo crear un URI de contenido para los comentarios que se utilizan con un
CursorLoader
en la actividad del usuario? Por favor, la mente, sólo sé el usuario URI en este momento. - ¿Puede alguien describir cómo crear un proceso de sincronización? No estoy seguro de si un SyncAdapter funciona aquí (nunca lo usó). ¿Es el proceso de sincronización sólo un
Service
que por un lado inicia tareas para descargar, analizar y almacenar comentarios en el cliente y por otro lado carga, codifica y envía comentarios al servidor? - ¿Cómo se ve el URI de contenido para un nuevo comentario? ¿El
ContentProvider
para los comentarios es el mismo que para los usuarios? ¿Existe sólo unSQLiteOpenHelper
en la aplicación?
El principal problema con el que estoy luchando es cómo diseñar la aplicación? Si sabes de una mejor solución sobre cómo sincronizar los usuarios y sus comentarios asociados, eres muy bienvenido.
Respuestas
Respuestas a la pregunta 1 y 3.
He extendido el modelo REST de la siguiente manera: El hash JSON devuelto para un comentario ahora incluye el id del usuario asociado. El mismo identificador también se incluye en el hash JSON para el usuario . Ambos objetos se almacenan en la base de datos local en el dispositivo Android. Esto me permite solicitar comentarios para un usuario específico. Simplemente paso el ID de usuario del servidor como cláusula WHERE
. El URI de contenido para comentarios no está en cascada como impliqué con mi pregunta. Es similar al URI de contenido del usuario :
content://com.example.myapp.provider.commentsprovider/comments
Tenga en cuenta que cambié la parte de autoridad de la cadena. Decidí crear un proveedor de contenido independiente para los usuarios y los comentarios .
- Cómo obtener el código de autorización de Google una sola vez
- ¿Cómo puedo verificar la facturación de Android en la aplicación con un servidor con Ruby?
- Dispositivo de Android de acceso de host local en la computadora portátil
- Cómo Firebase Auth con Rails?
- Convierta la aplicación Ruby on Rails en la aplicación Android PhoneGap nativa
- Publicar en Ruby on Rails la aplicación de android
- MultipartEntityBuilder para enviar imágenes al servidor de carril
- Solución de empuje de servidor en Rails
Una arquitectura simple es actualizar siempre las cosas en el servidor primero, enviando comentarios publicados al servidor de inmediato y desde ahí empujando una notificación a través de GCM a los usuarios que deben solicitar la lista de comentarios actualizada. El flujo sería como:
- Cuando la aplicación está abierta, envíe el ID de registro de GCM a su servidor de notificaciones push (diga uniqush-push , o su propio servidor usando una joya para manejar la lógica GCM ), de esta manera puede usarlo para enviar notificaciones push al usuario que le diga la aplicación Para actualizar los comentarios desde el servidor
- Construye tu caché inicial como quieras
- Cada vez que un usuario publica un comentario, envíelo al servidor y haga que el servidor responda con los datos del comentario creado, para que la aplicación pueda usarlo y ya lo almacene en caché si lo desea, utilizando el ID devuelto y cualquier otra cosa.
- En el servidor, cuando se publica un comentario, realiza un bucle a través de todos los usuarios afectados y utiliza el ID de registro de GCM para enviarle una notificación push, podría ser tan simple como tener sólo
"update_comments": "1"
- En la aplicación cuando la notificación push es aprovechada por el usuario, actualice la caché de comentarios con una solicitud al servidor
- Crash on hidden Vista
- Cómo detectar una aplicación de contactos de teléfono de Android apoya Dirección Postal Estructurada?