Sincronización de datos sin conexión

La sincronización de datos sin conexión es una característica del SDK de Azure Mobile Apps. Los datos se almacenan en un almacén local. Aunque la aplicación esté sin conexión, puede crear, modificar y buscar los datos. Los datos se sincronizan con el servicio Azure Mobile Apps cuando el dispositivo está en línea. El SDK admite la resolución de conflictos cuando se cambia el mismo registro tanto en el cliente como en el servicio.

La sincronización sin conexión tiene varias ventajas:

  • Mejora la capacidad de respuesta de la aplicación
  • Mejora la confiabilidad de la aplicación cuando hay conectividad de red incorrecta
  • Limita el uso de red en redes de alta latencia o de uso medido
  • Admite el uso desconectado

En los tutoriales siguientes se muestra cómo agregar sincronización sin conexión a los clientes móviles mediante Azure Mobile Apps:

¿Qué es una tabla de sincronización?

Los SDK de Azure Mobile Apps proporcionan IRemoteTable<T>, que accede directamente al servicio. Se produce un error en la operación si el dispositivo no tiene una conexión de red. Una tabla de sincronización (proporcionada por IOfflineTable<T>) proporciona las mismas operaciones en un almacén local. El almacén local se puede sincronizar con el servicio más adelante. Antes de realizar cualquier operación, debe inicializar el almacén local.

¿Qué es un almacén local?

Un almacén local es la capa de persistencia de datos del dispositivo cliente. La mayoría de las plataformas usan SQLite como almacén local, pero iOS usa Core Data. También puede implementar su propio almacén local. Por ejemplo, use una versión de SQLite con SQLCipher para generar un almacén cifrado.

¿Cómo funciona la sincronización sin conexión?

El código de cliente controla cuándo se sincronizan los cambios locales con un servicio de sincronización de datos. No se envía nada al servicio hasta que se insertan cambios locales. Del mismo modo, el almacén local se rellena con datos nuevos o actualizados solo cuando se extraen los datos.

Puede insertar operaciones pendientes para todas las tablas, una lista de tablas o una tabla:

// All tables
await client.PushTablesAsync();

// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);

// A single table
await table.PushItemsAsync();

Sincronización

La operación de inserción envía todos los cambios pendientes de la cola de operaciones al servicio. El cambio pendiente se envía al servicio a través de una llamada REST HTTP, que a su vez modifica la base de datos.

Las operaciones de inserción se realizan antes que las operaciones de extracción. La operación de extracción extrae los datos modificados del servicio y los almacena en el almacén local.

Inserción implícita

Si ejecuta una extracción en una tabla que tiene actualizaciones locales pendientes, la extracción ejecuta primero una inserción para esa tabla. Esta inserción ayuda a minimizar los conflictos entre los cambios que ya están en cola y los datos nuevos del servidor. Opcionalmente, puede configurar una inserción de todas las tablas estableciendo PushOtherTables en PullOptions:

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

Extracción de un subconjunto de registros

Opcionalmente, puede especificar una consulta que se usa para determinar qué registros se deben incluir en la base de datos sin conexión. Por ejemplo:

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

Sincronización incremental

Azure Mobile Apps implementa la sincronización incremental. Solo se extraen los registros que han cambiado desde la última operación de extracción. La sincronización incremental ahorra tiempo y ancho de banda cuando se procesan tablas grandes.

Para cada consulta única, el UpdatedAt campo del último registro transferido correctamente se almacena como un token en el almacén sin conexión. El último UpdatedAt valor se almacena en el almacén de tokens delta. El almacén delta-token se implementa como una tabla en el almacén sin conexión.

Rendimiento y coherencia

La sincronización a veces se detiene prematuramente. Por ejemplo:

  • La red que usa para la sincronización deja de estar disponible durante el proceso de sincronización.
  • Se fuerza el cierre de la aplicación durante la sincronización.

Para minimizar el riesgo de un problema de coherencia dentro de la base de datos sin conexión, cada registro se escribe en la base de datos a medida que se recibe. Opcionalmente, puede decidir escribir los registros en la base de datos en lotes. Las operaciones por lotes aumentan el rendimiento de las escrituras de la base de datos sin conexión durante la operación de extracción. Sin embargo, también aumentan el riesgo de una incoherencia entre los metadatos de la tabla y los datos de la tabla.

Puede ajustar el intervalo entre escrituras de la siguiente manera:

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

Este código recopila escrituras en lotes de 25 registros. Las pruebas de rendimiento sugieren que el rendimiento mejora hasta un valor de 25. Un WriteDeltaTokenInterval valor mayor que 25 no mejora significativamente el rendimiento.

Purga

Puede borrar el contenido del almacén local mediante IOfflineTable<T>.PurgeItemsAsync. La purga puede ser necesaria si tiene datos obsoletos en la base de datos de cliente o si desea descartar todos los cambios pendientes. Una purga borra una tabla del almacén local. Para purgar una tabla:

await table.PurgeItemsAsync("", new PurgeOptions());

El PurgeItemsAsync() método produce un InvalidOperationException error si hay cambios pendientes en la tabla. En este caso, puede forzar la purga para que suceda:

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

Purgar es un último recurso para limpiar una tabla en el almacén sin conexión, ya que borra todos los registros de la memoria caché y requiere que vuelva a descargarlos.