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 

 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.

  1. ¿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.
  2. ¿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?
  3. ¿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 un SQLiteOpenHelper 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 .

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
  • Solicitud POST con Retrofit dando 500
  • No se pueden enviar datos de JSON desde Android al servidor ROR
  • Configurar la autenticación de http
  • Grape Rails API con Android
  • Diseña aplicaciones Omniauth y Iphone / Android
  • Iniciar el entorno de desarrollo de rails en android
  • Autenticación mediante Facebook a través de Rails API
  • ¿Cómo usar doorkeeper con un cliente android?
  • Tipo de entrada = número no es posible insertar números negativos en el teléfono móvil
  • ¿Qué método de autenticación debo usar con la gema Sorcery usando una aplicación móvil?
  • Cordova App en Android usando SSL enviando multipart / form-data causes Error de la aplicación de rack: # <EOFError: cuerpo de contenido incorrecto>
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.