syncadapter studio sincronizar sincronización enviar ejemplo datos crear conexion con aplicaciones aplicacion android database multithreading parse.com

studio - sync adapter android ejemplo



Android: ¿Cuál es la forma más sencilla de sincronizar una base de datos remota en segundo plano? (2)

Tengo una base de datos Android alojada en Parse y he estado tratando de encontrar la mejor forma / prácticas para actualizar mi LocalStorage con los últimos cambios remotos.

No estoy pidiendo código o sintaxis, solo estaría buscando un conjunto de pasos a seguir, estoy seguro de que necesitaría usar un hilo de trabajo porque no quiero bloquear la interfaz de usuario, me encantaría hacer que la transición sea lo más fácil posible para el usuario (ni siquiera se daría cuenta de que está sucediendo una actualización) y quiero que suceda cuando la aplicación esté en primer plano. Las ideas que he obtenido hasta ahora:

  • Use multihilo (Loopers, Handlers, Thread) y actualice cada tabla en un hilo separado.
  • Intente acelerar la solicitud para minimizar el uso de la CPU y obtener una tabla a la vez.
  • Use un cargador y solo escuche los cambios.
  • Llame a IntentService para obtener tabla por tabla también.
  • Cree un servicio independiente y deje que la base de datos se actualice después de cerrar la aplicación.
  • No actualice la base de datos en segundo plano y espere hasta que el usuario realmente necesite los datos y la recupere.

Ya probé el IntentService uno, no es tan fácil como me gustaría:

public class DataService extends IntentService { public DataService() { super(DataService.class.getName()); } @Override protected void onHandleIntent(Intent intent) { String[] entities = { "Img", "Pack", "Technology", "Term", "TermHierarchy", "TermImplementation", "TermTerm", "UserTechnology", "UserTerm", }; for (String entity : entities) { updateLocalTable(entity); } } private void updateLocalTable(String entity) { ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(entity); query.findInBackground(new FindCallback<ParseObject>() { @Override public void done(List<ParseObject> objects, ParseException e) { if (e == null){ ParseObject.pinAllInBackground(objects); }else { Log.e(TAG_, e.toString()); } } }); } }

Además, lo llamo la primera vez que ocurre un cambio de conexión (Wi-Fi disponible). ¿Debería simplemente llamarlo a onCreate, o crear una alarma para actualizar una vez cada cierta cantidad de tiempo, o justo cuando la actividad está terminando?

He visto algunas publicaciones relacionadas:

Actualizar datos en el fondo periódicamente (Android)

Sincronización de un cliente de Android con una base de datos SQL-server remota, usando un servicio web

Enviar datos de la base de datos a través

sincronizar la base de datos remota (mysql) con la base de datos sqlite y viceversa

Pero ninguno de ellos tiene respuestas buenas y detalladas y realmente no abordan el problema.

También agregaré que Parse maneja todas las llamadas RESTful y la conversión JSON, así que no tengo que preocuparme por eso.

Editar.

Acabo de encontrar un video que explica estos conceptos (y admite la respuesta proporcionada por @gsgsgs) en menos de 2 minutos:

https://www.youtube.com/watch?v=Expbi0lHLRE


@ Evin1_,

En mi opinión, las cosas importantes son:

1 / Piensa en el orden:

Si algunas tablas incluyen información de otra, comience por sincronizarlas en un orden correcto

2 / Usar índices:

Los índices son tablas de búsqueda especiales que el motor de búsqueda de bases de datos puede usar para acelerar la recuperación de datos

3 / Usar transacciones:

Le dará la oportunidad de deshacer si algo sale mal

4 / Multithreading:

La velocidad y la eficiencia de una operación de larga duración y uso intensivo de datos a menudo mejora cuando se divide en operaciones más pequeñas que se ejecutan en múltiples hilos

5 / evitar la pérdida de conexión:

Si el usuario desactiva 3G o Wifi, debe poder saber qué sucedió, mostrar mensajes de error u otra cosa.

6 / La cantidad de datos:

Si tienes una gran cantidad de datos, no los envíes en un solo Json, córtalo en paquetes más pequeños.

Espero eso ayude.


Puedes probar 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

No es muy simple de implementar, pero tiene algunas ventajas:

  • Sincronización de fondo programada por el sistema con otras solicitudes de red para ahorrar batería
  • Puede ser configurado por el usuario en la configuración de sincronización (deshabilitar o habilitar la sincronización de fondo)
  • El adaptador intenta sincronizar automáticamente si la solicitud falló con el retroceso exponencial
  • Puedes usarlo fácilmente con el tuyo ContentProvider
  • El adaptador puede sincronizarse en un proceso separado si lo desea

Aquí un tutorial.