Cómo sincronizar grandes listas entre cliente y servidor
Me gustaría sincronizar una gran lista de elementos entre el cliente y el servidor. Como la lista es bastante grande, no puedo sincronizarla en una sola solicitud, ¿cómo puedo asegurar que la lista se sincronice con una cantidad razonable de llamadas al servicio de sincronización?
Por ejemplo:
- Enviar una imagen de Android a un servicio Web ASP.NET
- Conectar con un emulador de Android a la localhost webservice
- Llame al servicio web .NET en Android
- KSoap2 Android recibe un arreglo de objetos
- HttpURLConnection getResponseCode () deos no devuelve si no hay conexión a Internet
Y quiero sincronizar una lista con 100.000 artículos así que hago un servicio web con la siguiente firma
getItems(int offset,int quantity): Item[]
El problema viene cuando, entre la llamada y la llamada, la lista se modifica. Por ejemplo:
getItems(0,100) : Return items (in the original list) [0,100) getItems(100,100): Return items (in the original list) [100,200) ##### before the next call the items 0-100 are removed #### getItems(200,100): Return items (in the original list) [300,400)
Por lo tanto, los elementos [200.300] nunca se recuperan. (Los elementos duplicados también se pueden recuperar si se agregan elementos en lugar de quitarlos.
¿Cómo puedo asegurar una sincronización correcta de esta lista?
- KSOAP2 java.lang.RuntimeException: No se puede serializar
- Cómo pasar String array a webservice usando ksoap2?
- Interacción entre Java y Android
- Analizador de XML común de Android
- Analizando la respuesta ksoap2
- ¿Cómo puedo convertir los datos de InputStream en String en SOAP Webservices de Android
- Cómo manejar la conexión de red lenta en Java / Android
- Problema del API del cliente Jersey
-
De vez en cuando, el servicio debe guardar instantáneas inmutables. La interfaz debe ser
getItems(long snapshotNumber, int offset,int quantity)
-
Para ahorrar tiempo, espacio y tráfico, no todas las modificaciones de la lista deben formar una instantánea, pero cada modificación debe formar un mensaje de registro (por ejemplo, agregar elementos, quitar el rango de elementos) y que los mensajes de registro se debe enviar al cliente en su lugar De instantáneas completas. La interfaz puede ser
getModification(long snapshotNumber, int modificationNumber):Modification
.
¿Se puede hacer la lista ordenada en algún parámetro en el lado del servidor? Por ejemplo, un caso de uso del mundo real para este escenario es mostrar registros en una tabla en la interfaz de usuario. El número de registros en el lado del servidor puede ser enorme, por lo que no desea obtener toda la lista a la vez y en su lugar se obtiene en cada desplazamiento que el usuario hace.
En este caso, si se ordena la lista, se obtiene un montón de cosas de forma gratuita. Y su API se convierte en getItems(long lastRecordId,int quantity)
. Aquí lastRecordId
sería una clave única que identifica ese registro en particular. Utilice esta clave para calcular el desplazamiento (en el lado del servidor) y recuperar el lote siguiente de esta ubicación de desplazamiento y devolver el recordId
del último registro al cliente que utiliza en su próxima llamada a la API.
No tiene que mantener las instantáneas y no se recuperarán los registros duplicados. Los escenarios que usted menciona en caso de remociones / inserciones no ocurren en este caso. Pero en algún momento, tendrías que descartar la copia que tiene el cliente e iniciar la sincronización de nuevo si quieres realizar un seguimiento de adiciones y eliminaciones en el lado del cliente para los datos que el cliente ya ha visto.
- Obtener "EVP_DecryptFinal_ex: longitud de bloque final errónea" durante el desencriptado
- Problema de memoria con la caché de volley