Sincronizar datos entre la aplicación Android y el servidor web

Quiero sincronizar datos (como registro db, medios) entre una aplicación de Android y un servidor. Si has visto Evernote o aplicaciones similares, ciertamente entiendes lo que quiero decir.

Tengo alguna pregunta (imagino que queremos sincronizar registros de DB):

  1. Cada usuario tiene una parte del espacio del servidor para sí mismo (como Evernote o Dropbox ). Tal vez el usuario crea nuevos registros por teléfono móvil y crea nuevos registros en el servidor. ¿Cómo puedo emparejar estos registros juntos? Si hay registros con la misma ID ¿Qué algoritmos me sugiere?

  2. Excepto JSON , ¿Hay alguna forma de enviar datos entre el dispositivo móvil y el servidor?

  3. Si SyncAdapter y ContentProvider pueden resolver mis problemas, por favor, explícanos exactamente para mí. (Si pudiera ofrecer algunas muestras o tutoriales para mí O Cualquier consejo o palabras clave para ayudar a ampliar / guiar mi búsqueda sería apreciado también).

    11 Solutions collect form web for “Sincronizar datos entre la aplicación Android y el servidor web”

    Voy a tratar de responder a todas sus preguntas, abordando la pregunta más amplia: ¿Cómo puedo sincronizar los datos entre un servidor web y una aplicación para Android?


    La sincronización de datos entre su servidor web y una aplicación para Android requiere un par de componentes diferentes en su dispositivo Android.

    Almacenamiento persistente:

    De esta forma, su teléfono almacena los datos que recibe del servidor web. Un método posible para lograr esto es escribir su propio Custom ContentProvider respaldado por una base de datos Sqlite. Un tutorial decente para un proveedor de contenido se puede encontrar aquí: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

    Un ContentProvider define una interfaz coherente para interactuar con los datos almacenados. También podría permitir que otras aplicaciones interactúen con sus datos si lo desea. Detrás de su ContentProvider podría ser una base de datos Sqlite, un caché o cualquier mecanismo de almacenamiento arbitrario.

    Si bien me gustaría recomendar el uso de un ContentProvider con una base de datos Sqlite que podría utilizar cualquier mecanismo de almacenamiento basado en java que quería.

    Formato de Intercambio de Datos:

    Este es el formato que usas para enviar los datos entre tu servidor web y tu aplicación para Android. Los dos formatos más populares en estos días son XML y JSON. Al elegir su formato, usted debe pensar en qué tipo de bibliotecas de serialización están disponibles. Sé de sobra que hay una fantástica biblioteca para la serialización json llamada gson: http://code.google.com/p/google-gson/ , aunque estoy seguro de que existen bibliotecas similares para XML.

    Servicio de sincronización

    Usted querrá algún tipo de tarea asíncrona que puede obtener nuevos datos de su servidor y actualizar el contenido móvil para reflejar el contenido del servidor. También deseará notificar al servidor cada vez que realice cambios locales en el contenido y desee reflejar esos cambios. Android proporciona el patrón SyncAdapter como una forma de resolver fácilmente este patrón. Tendrás que registrar cuentas de usuario y, a continuación, Android realizará mucha magia para ti y te permitirá sincronizar automáticamente. Aquí hay un buen tutorial: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


    En cuanto a cómo identificar si los registros son los mismos, normalmente se crean elementos con un identificador único que se almacenan tanto en el dispositivo android como en el servidor. Puede utilizarlo para asegurarse de que se está refiriendo a la misma referencia. Además, puede almacenar atributos de columna como "updated_at" para asegurarse de que siempre está recibiendo los datos más recientes o no escribir accidentalmente sobre datos recién escritos.

    Espero que esto ayude.

    Si pensamos en el día de hoy , la respuesta aceptada es demasiado antigua. Como sabemos que tenemos muchas nuevas bibliotecas que pueden ayudarle a hacer este tipo de aplicación.

    Usted debe aprender los siguientes temas que le ayudarán seguramente:

    • SyncAdapter: El componente de adaptador de sincronización de la aplicación encapsula el código para las tareas que transfieren datos entre el dispositivo y un servidor. Según la programación y los disparadores que proporciona en su aplicación, la estructura del adaptador de sincronización ejecuta el código en el componente del adaptador de sincronización.

    • RealM : Realm es una base de datos móvil: un reemplazo para SQLite & Core Data.

    • Retrofit Cliente HTTP de tipo seguro para Android y Java de Square, Inc. Debe aprender a-smart-way-to-use-retrofit

    Y su lógica de sincronización para la base de datos como: ¿Cómo sincronizar la base de datos SQLite en el teléfono Android con base de datos MySQL en el servidor?

    Mejor suerte para todos los estudiantes nuevos. 🙂

    Si usted escribe esto usted mismo estos son algunos de los puntos a tener en cuenta

    Autenticación adecuada entre el dispositivo y el servidor de sincronización

    Un protocolo de sincronización entre el dispositivo y el servidor. Por lo general va en 3 fases, la autenticación, intercambio de datos, intercambio de estado (que las operaciones trabajadas y que no)

    Elija su formato de carga útil. Sugiero SyncML XML basado mezclado con formato basado en JSON para representar los datos reales. Por tanto, SyncML para el protocolo y JSON para los datos reales que se intercambian. Utilizar JSON Array mientras se manipulan los datos siempre se prefiere, ya que es fácil acceder a los datos mediante JSON Array.

    Mantener un registro de los cambios de datos tanto en el cliente como en el servidor. Usted puede mantener un changelog de ids que cambian y recogerlos durante una sesión de sincronización. Además, borre el changelog a medida que los objetos se sincronicen correctamente. También puede utilizar una variable booleana para confirmar el estado de sincronización, es decir, la última vez que se sincronizó. Será útil para los usuarios finales identificar el momento en que se realiza la última sincronización.

    Necesita tener una forma de comunicarse desde el servidor al dispositivo para iniciar una sesión de sincronización a medida que cambian los datos en el servidor. Puede utilizar C2DM o escribir su propia comunicación basada en tcp persistente. El enfoque tcp es muy transparente

    Una forma de replicar los cambios de datos en varios dispositivos

    Y por último, pero no menos importante, una forma de detectar y manejar conflictos

    Espero que esto ayude como un buen punto de partida.

    @Grantismo proporciona una gran explicación en general. Si desea saber que la gente está haciendo realmente estas cosas te sugiero que eche un vistazo a cómo Google hizo para la aplicación de Google IO de 2014 (siempre vale la pena tomar una mirada profunda en el código fuente de estas aplicaciones que lanzan. Mucho que aprender de allí).

    Aquí hay una entrada en el blog: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

    Esencialmente, en el lado de la aplicación: GCM para la señalización, adaptador de sincronización para la búsqueda de datos y hablar correctamente con el proveedor de contenido que hará las cosas persistentes (sí, aísla el DB de acceso directo desde otras partes de la aplicación).

    Además, si desea echar un vistazo al código del 2015: https://github.com/google/iosched

    Te puedo sugerir Cloudant. Es una base de datos-como-un-servicio con soporte de sincronización completa.

    Tienen un nivel libre.

    Mire en parse.com .

    (Hoy en back4app.com.)

    Es un servicio de base de datos del lado del servidor muy sencillo y fácil de usar que ofrece un gran API de cliente android

    Una forma de lograr esto para tener una aplicación del lado del servidor que espera los datos. Los datos se pueden enviar utilizando objetos HttpRequest en Java o puede escribir su propia utilidad de transferencia de datos TCP/IP . Los datos se pueden enviar utilizando el formato JSON o cualquier otro formato que usted considere adecuado. También los datos pueden ser cifrados antes de enviar al servidor si contiene información confidencial. Todas las aplicaciones de servidor tienen que hacer es esperar para HttpRequests para entrar y analizar los datos y almacenar en cualquier lugar que desee.

    Por ejemplo, desea sincronizar tabla todoTable de Sqlite a Sqlite

    Primero, cree una version (type INT) nombre de columna version (type INT) en todoTable para Sqlite y Sqlite Introduzca aquí la descripción de la imagen

    Segundo, cree un nombre de tabla database_version con un nombre de columna currentVersion(INT)
    Introduzca aquí la descripción de la imagen

    En MySql, cuando agrega un nuevo elemento a todoTable o al elemento de actualización, debe actualizar la versión de este elemento en +1 y también actualizar el valor currentVersion Introduzca aquí la descripción de la imagen

    En Android, cuando desee sincronizar (pulsando manualmente el botón de sincronización o una ejecución de servicio con un período de tiempo):

    Enviará la solicitud con el Sqlite currentVersion (actualmente es 1) al servidor.
    Entonces en el servidor, usted encuentra qué artículo en MySql tiene valor de versión más grande que Sqlite currentVersion (1) entonces respuesta a Androide (en este ejemplo el artículo 3 con la versión 2 responderá a Androide)

    En SQLite, agregará o actualizará un nuevo elemento a todoTable y actualizará el método currentVersion

    Yo sugeriría usar un protocolo binario webservice similar a Hessian . Funciona muy bien y tienen una implementación para Android. Puede ser un poco pesado, pero depende de la aplicación que está construyendo. Espero que esto ayude.

    ¿Por qué no utilizar Google Cloud Messaging? Aquí está el enlace: http://developer.android.com/google/gcm/index.html

    @Grantismo ofrece una gran visión general de los componentes de sincronización de Android.

    La biblioteca SyncManagerAndroid proporciona una implementación sencilla de sincronización de 2 vías para conectarse al marco de sincronización de Android (AbstractThreadedSyncAdapter.OnPerformSync).

    https://github.com/sschendel/SyncManagerAndroid

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.