Quiero sincronizar datos (como db record, media) 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 (imagina que queremos sincronizar registros DB):
Cada usuario tiene una parte del espacio del servidor para sí mismo (como
Evernote
oDropbox
). 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?Excepto JSON , ¿hay alguna forma de enviar datos entre el dispositivo móvil y el servidor?
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).
fuente
Respuestas:
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.
fuente
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. :)
fuente
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.
fuente
@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
fuente
Por ejemplo, desea sincronizar la tabla
todoTable
deMySql
aSqlite
En primer lugar, crear un nombre de columna
version (type INT)
entodoTable
tantoSqlite
yMySql
Segundo, cree un nombre de tabla
database_version
con el nombre de una columnacurrentVersion(INT)
En
MySql
, cuando agregatodoTable
o actualiza un nuevo elemento , debe actualizar la versión de este elemento en +1 y también actualizar elcurrentVersion
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
Sqlite
versión actual (actualmente es 1) al servidor.Luego, en el servidor, encuentra qué elemento
MySql
tiene un valor de versión mayor queSqlite
currentVersion (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 elementotodoTable
y actualizará la versión actualfuente
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
fuente
Una forma de lograr esto es tener una aplicación del lado del servidor que espere los datos. Los datos pueden enviarse utilizando
HttpRequest
objetos en Java o puede escribir su propiaTCP/IP
utilidad de transferencia de datos. Los datos se pueden enviar utilizando elJSON
formato 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 aHttpRequests
que entren y analizar los datos y almacenarlos en cualquier lugar que desee.fuente
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.
fuente
@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
fuente