Sincronización de datos entre la aplicación de 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 (imaginemos que queremos sincronizar los registros de la base de datos):

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

  2. Excepto JSON , ¿hay alguna forma de enviar datos entre el dispositivo del teléfono móvil y el servidor?

  3. Si SyncAdapter y ContentProvider pueden resolver mis problemas, explique exactamente para mí. (Si pudiera ofrecerme algunas muestras o tutoriales O BIEN También agradecería cualquier consejo o palabras clave para ayudar a ampliar / guiar mi búsqueda).

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


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

    Almacenamiento persistente:

    Así es como su teléfono realmente almacena los datos que recibe del servidor web. Un posible método para lograr esto es escribir su propio ContentProvider personalizado 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 consistente para interactuar con sus datos almacenados. También podría permitir que otras aplicaciones interactúen con sus datos si así lo desea. Detrás de su ContentProvider podría haber una base de datos Sqlite, un caché o cualquier mecanismo de almacenamiento arbitrario.

    Aunque ciertamente recomendaría usar un ContentProvider con una base de datos Sqlite, podría usar cualquier mecanismo de almacenamiento basado en Java que quisiera.

    Formato de intercambio de datos:

    Este es el formato que utiliza para enviar los datos entre su servidor web y su aplicación de Android. Los dos formatos más populares actualmente son XML y JSON. Al elegir su formato, debe pensar en qué tipo de bibliotecas de serialización están disponibles. Sé de antemano que hay una biblioteca fantástica para la serialización json llamada gson: https://github.com/google/gson , aunque estoy seguro de que existen bibliotecas similares para XML.

    Servicio de Sincronización

    Querrá algún tipo de tarea asíncrona que pueda obtener nuevos datos de su servidor y actualizar el contenido móvil para reflejar el contenido del servidor. También querrás notificar al servidor cada vez que realices cambios locales al contenido y quieras reflejar esos cambios. Android proporciona el patrón SyncAdapter como una forma de resolver fácilmente este patrón. Tendrá que registrar cuentas de usuario, y luego Android le hará mucha magia y le 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 identificas si los registros son los mismos, normalmente crearás elementos con una identificación única que almacenas tanto en el dispositivo Android como en el servidor. Puede usar eso para asegurarse de que se refiere a la misma referencia. Además, puede almacenar atributos de columna como “updated_at” para asegurarse de que siempre obtiene los datos más recientes o no escribe accidentalmente datos recién escritos.

    Si pensamos en el día de hoy , la respuesta aceptada es demasiado antigua. Como sabemos, tenemos muchas bibliotecas nuevas que pueden ayudarlo a realizar este tipo de aplicaciones.

    Debes aprender los siguientes temas que te ayudarán seguramente:

    • SyncAdapter: el componente del adaptador de sincronización en su aplicación encapsula el código para las tareas que transfieren datos entre el dispositivo y un servidor. En función de la progtwigción y los factores desencadenantes que proporcione en su aplicación, la infraestructura 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 y Core Data.

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

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

    La mejor suerte para todos los principiantes. 🙂

    Si escribes esto tú 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, irá en 3 fases, autenticación, intercambio de datos, intercambio de estado (qué operaciones funcionaron y cuáles fallaron)

    Elija su formato de carga. Sugiero XML basado en SyncML mezclado con formato basado en JSON para representar los datos reales. Entonces SyncML para el protocolo, y JSON para los datos reales que se intercambian. Siempre se prefiere utilizar JSON Array mientras se manipulan los datos, ya que es fácil acceder a los datos utilizando JSON Array.

    Realizando un seguimiento de los cambios de datos tanto en el cliente como en el servidor. Puede mantener un registro de cambios de identificadores que cambian y recogerlos durante una sesión de sincronización. Además, borre el registro de cambios a medida que los objetos se sincronizan con éxito. También puede usar una variable booleana para confirmar el estado de sincronización, es decir, la última hora de sincronización. Será útil para los usuarios finales identificar la hora en que se realizó 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 los datos cambian en el servidor. Puede usar C2DM o escribir su propia comunicación basada en tcp persistente. El enfoque de tcp es mucho transparente

    Una forma de replicar los cambios de datos en múltiples 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 sobre el conjunto. Si desea saber quiénes son las personas que realmente están haciendo estas cosas, le sugiero que consulte cómo lo hizo Google para la aplicación Google IO de 2014 (siempre vale la pena echarle un vistazo al código fuente de estas aplicaciones que lanzan. mucho que aprender de allí).

    Aquí hay una entrada en el blog sobre esto: 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 señalización, Sync Adapter para obtener datos y hablar correctamente con Content Provider que hará que las cosas sean persistentes (sí, aísla el DB del acceso directo de otras partes de la aplicación).

    Además, si desea consultar el código de 2015: https://github.com/google/iosched

    Mira parseplatform.org . es un proyecto de código abierto.

    (Así como también puede obtener un paquete comercial disponible en back4app.com ).

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

    Por ejemplo, quiere sincronizar la tabla todoTable de Sqlite a Sqlite

    Primero, cree una version (type INT) nombre de columna version (type INT) en todoTable para Sqlite y Sqlite enter image description here

    Segundo, crea un nombre de tabla database_version currentVersion(INT) con un nombre de columna currentVersion(INT)
    enter image description here

    En MySql , cuando agrega un nuevo elemento a todoTable o actualiza el elemento, debe actualizar la versión de este artículo por +1 y también actualizar la currentVersion enter image description here

    En Android , cuando desee sincronizar (mediante el botón de sincronización de la prensa manual o un servicio ejecute con el período):

    Sqlite la solicitud con Sqlite currentVersion (actualmente es 1) al servidor.
    Luego, en el servidor, encontrará qué elemento en MySql tiene un valor de versión mayor que Sqlite currentVersion (1) luego la respuesta a Android (en este ejemplo, el elemento 3 con la versión 2 responderá a Android)

    En SQLite , agregará o actualizará un nuevo elemento a todoTable y actualizará la versión actual.

    Una forma de lograr esto es tener una aplicación del lado del servidor que espere los datos. Los datos se pueden enviar usando 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 considere adecuado. También se pueden cifrar los datos antes de enviarlos al servidor si contienen información confidencial. Todo lo que tiene que hacer la aplicación del Servidor es esperar que HttpRequests entre y analice los datos y los almacene en el lugar que desee.

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

    @Grantismo ofrece una excelente descripción general de los componentes de sincronización de Android.

    La biblioteca SyncManagerAndroid proporciona una implementación simple de sincronización bidireccional para conectarla a la estructura Sync de Android (AbstractThreadedSyncAdapter.OnPerformSync).

    https://github.com/sschendel/SyncManagerAndroid