Sincronizar datos entre la aplicación de Android y el servidor web [cerrado]

262

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

Tengo alguna pregunta (imagina que queremos sincronizar registros DB):

  1. Cada usuario tiene una parte del espacio del servidor para sí mismo (como Evernoteo Dropbox). Tal vez el usuario crea nuevos registros por teléfono celular y crea nuevos registros en el servidor. ¿Cómo puedo unir estos registros? 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, explique exactamente por mí. (Si pudiera ofrecerme algunas muestras o tutoriales O O cualquier consejo o palabra clave para ayudar a ampliar / guiar mi búsqueda también sería apreciado).

Omid Nazifi
fuente
1
Primero debe averiguar (decidir) su protocolo de comunicación con el servidor, por lo tanto, qué datos puede transferir y cómo.
hovanessyan
Eso es importante para mí, transferir datos SQLlite. pero sabría cómo transferir otros datos. No entiendo tu significado sobre el protocolo. por favor más explique.
Omid Nazifi
Por protocolo me refiero a esto simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
pruebe konysync, un producto de konylabs que brinda soluciones integrales en varias plataformas (android, windows, ios), servidores web, proveedores de datos (salesforce, proveedores sap), bases de datos (sqlserver, mysql ...)
saimadan

Respuestas:

311

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. Puede encontrar un tutorial decente para un proveedor de contenido 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, una caché o cualquier mecanismo de almacenamiento arbitrario.

Si bien 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 en estos días son XML y JSON. Al elegir su formato, debe pensar qué tipo de bibliotecas de serialización están disponibles. Sé de antemano que hay una biblioteca fantástica para la serialización de 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 asincrónica que pueda obtener nuevos datos de su servidor y actualizar el contenido móvil para reflejar el contenido del servidor. También querrá 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á que registrar cuentas de usuario, y luego Android realizará mucha magia por usted 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 identifica si los registros son los mismos, generalmente creará elementos con una identificación única que almacenará 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 sobre datos recién escritos.

Grantismo
fuente
3
¿Qué pasa con la gran cantidad de datos? ¿Cómo puedo sincronizar?
Pratik Butani
44
Muy bien explicado, solo tengo una nota ... SyncAdapter -> "realizar mucha magia". Espero que lo estés refiriendo como magia negra ... es totalmente malvado.
MRodrigues
@MRodrigues: SyncAdapter podría ser magia negra para el desarrollador, pero sigue siendo mágica para la estabilidad y la funcionalidad, es mucho mejor que otras bibliotecas
Milad Metias
2
¿Qué requiere el servicio web para sincronizarlo con un dispositivo Android? ¿Es posible con Spring?
jublikon
58

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 seguramente te ayudarán:

  • 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. Según la programación y los desencadenantes que proporciona en su aplicación, el marco 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.

  • El cliente HTTP Retrofit Type-safe para Android y Java de Square, Inc. debe aprender una actualización inteligente

Y su lógica de sincronización para la base 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 nuevos alumnos. :)

Pratik Butani
fuente
El enlace a una actualización inteligente de la manera de usar está muerto
Greg Holst
@GregHolst actualizado.
Pratik Butani el
3
Aún abajo. O requiere iniciar sesión? Archive.org lo tiene: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
bobpaul
24

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

Elija su formato de carga útil. 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 usar JSON Array mientras se manipulan los datos, ya que es fácil acceder a los datos con JSON Array.

Realizar 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 ya que los objetos se sincronizan correctamente. También puede usar 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 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 persistente basada en TCP. El enfoque tcp es muy fluido

Una forma de replicar 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.

Openmobster
fuente
14

@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 eche un vistazo a cómo lo hizo Google para la aplicación Google IO de 2014 (siempre vale la pena echar un vistazo profundo al código fuente de estas aplicaciones que lanzan). mucho que aprender de allí).

Aquí hay una publicación de blog al respecto: 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, adaptador de sincronización para buscar datos y hablar correctamente con el proveedor de contenido que hará que las cosas sean persistentes (sí, aísla el DB del acceso directo desde otras partes de la aplicación).

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

Ciro Costa
fuente
El código fuente de la aplicación Google IO es bastante útil.
Richeek
10

Por ejemplo, desea sincronizar la tabla todoTablede MySqlaSqlite

En primer lugar, crear un nombre de columna version (type INT)en todoTabletanto SqliteyMySql ingrese la descripción de la imagen aquí

Segundo, cree un nombre de tabla database_versioncon el nombre de una columnacurrentVersion(INT)
ingrese la descripción de la imagen aquí

En MySql, cuando agrega todoTableo actualiza un nuevo elemento , debe actualizar la versión de este elemento en +1 y también actualizar elcurrentVersion ingrese la descripción de la imagen aquí

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

Enviará la solicitud con la Sqliteversión actual (actualmente es 1) al servidor.
Luego, en el servidor, encuentra qué elemento MySqltiene un valor de versión mayor que SqlitecurrentVersion (1) y luego responde a Android (en este ejemplo, el elemento 3 con la versión 2 responderá a Android)

En SQLite, agregará o actualizará un nuevo elemento todoTabley actualizará la versión actual

Phan Van Linh
fuente
1
Su idea es brillante pero aún no puede entender el diseño de la mesa correctamente. Junto con los servicios de descanso y el servicio de sincronización adecuado, funciona
Ahesanali Suthar
6

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

(Además, puede optar por 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 ofrece una gran API del lado del cliente Android

Kyle
fuente
¿Cuáles son los planes gratuitos que ofrece la oferta?
Prakhar Mohan Srivastava
12
http://parse.com/ está cerrado.
Chintan Rathod
44
aún puede usar la funcionalidad de parse.com, pero en su propio servidor, han abierto sus
fuentes
3

Una forma de lograr esto es tener una aplicación del lado del servidor que espere los datos. Los datos pueden enviarse utilizando HttpRequestobjetos en Java o puede escribir su propia TCP/IPutilidad de transferencia de datos. Los datos se pueden enviar utilizando el JSONformato o cualquier otro formato que considere adecuado. Además, los datos se pueden cifrar antes de enviarlos al servidor si contienen información confidencial. Todo lo que la aplicación del servidor tiene que hacer es esperar a HttpRequestsque entren y analizar los datos y almacenarlos en cualquier lugar que desee.

Mayank
fuente
¿Cómo verificar los datos actualizados en la aplicación local y el servidor? y ¿Cómo fusionarse? No es bueno que envíe todos los registros por JSON o cualquier cosa a la solicitud para fusionarlos. ¿Qué piensas?
Omid Nazifi
2
puede usar un indicador, como "en el servidor" con un int / bool 1/0 para sí o no. cuando se envía un registro / archivo / bloque de datos, verifique el éxito en el servidor y cambie el bit a sí. entonces, si está utilizando algo como SQLite, puede hacer una cosa de tipo "SELECCIONAR * DESDE my_table WHERE enviado = 0" para enviar cualquier registro nuevo
Evan R.
1

Sugeriría 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é creando. Espero que esto ayude.

Neo
fuente
1

@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 conectarse al marco de sincronización de Android (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

Sean
fuente