Sincronización de datos sin conexión en Azure Mobile AppsOffline Data Sync in Azure Mobile Apps

¿Qué es la sincronización de datos sin conexión?What is offline data sync?

La sincronización de datos sin conexión es una característica de SDK de cliente y de servidor de Azure Mobile Apps que facilita a los desarrolladores la creación de aplicaciones que funcionen sin una conexión de red.Offline data sync is a client and server SDK feature of Azure Mobile Apps that makes it easy for developers to create apps that are functional without a network connection.

Cuando la aplicación está en modo sin conexión, aún se pueden crear y modificar datos, que se guardan en un almacén local.When your app is in offline mode, you can still create and modify data, which are saved to a local store. Cuando la aplicación se vuelve a conectar, esta puede sincronizar los cambios locales con el back-end de la aplicación de Azure.When the app is back online, it can synchronize local changes with your Azure Mobile App backend. La característica también admite la detección de conflictos cuando se cambia el mismo registro en el cliente y el back-end.The feature also includes support for detecting conflicts when the same record is changed on both the client and the backend. Luego, los conflictos se pueden manejar en el servidor o el cliente.Conflicts can then be handled either on the server or the client.

La sincronización sin conexión tiene varias ventajas:Offline sync has several benefits:

  • Mejore la capacidad de respuesta de las aplicaciones almacenando en caché datos de servidor de forma local en el dispositivo.Improve app responsiveness by caching server data locally on the device
  • Creación de aplicaciones sólidas que sigan siendo útiles cuando hay problemas de redCreate robust apps that remain useful when there are network issues
  • Permitir a los usuarios finales crear y modificar datos incluso cuando no hay acceso de red, proporcionando escenarios con muy poca o ninguna conectividad.Allow end users to create and modify data even when there is no network access, supporting scenarios with little or no connectivity
  • Sincronizar datos entre diferentes dispositivos y detectar conflictos cuando dos dispositivos modifican el mismo registro.Sync data across multiple devices and detect conflicts when the same record is modified by two devices
  • Limitar el uso de las redes medidas o de alta latenciaLimit network use on high-latency or metered networks

Los siguientes tutoriales muestran cómo incorporar la sincronización sin conexión a los clientes móviles con Azure Mobile Apps:The following tutorials show how to add offline sync to your mobile clients using Azure Mobile Apps:

¿Qué es una tabla de sincronización?What is a sync table?

Para tener acceso al extremo de "/tables", los SDK de cliente móvil de Azure proporcionan interfaces como IMobileServiceTable (SDK de cliente de .NET) o MSTable (cliente de iOS).To access the "/tables" endpoint, the Azure Mobile client SDKs provide interfaces such as IMobileServiceTable (.NET client SDK) or MSTable (iOS client). Estas API se conectan directamente al back-end de la aplicación móvil de Azure y generan errores si el dispositivo cliente no tiene una conexión de red.These APIs connect directly to the Azure Mobile App backend and fail if the client device does not have a network connection.

Para admitir el uso sin conexión, la aplicación debe usar las API de la tabla de sincronización, como IMobileServiceSyncTable (SDK de cliente de .NET) o MSSyncTable (cliente de iOS).To support offline use, your app should instead use the sync table APIs, such as IMobileServiceSyncTable (.NET client SDK) or MSSyncTable (iOS client). Las mismas operaciones CRUD (creación, lectura, actualización, eliminación) funcionan con las API de la tabla de sincronización, salvo que ahora leerán desde un almacén local o escribirán en él.All the same CRUD operations (Create, Read, Update, Delete) work against sync table APIs, except now they read from or write to a local store. Antes de poder realizar cualquier operación de la tabla de sincronización, se debe inicializar el almacén local.Before any sync table operations can be performed, the local store must be initialized.

¿Qué es un almacén local?What is a local store?

Un almacén local es la capa de persistencia de datos del dispositivo cliente.A local store is the data persistence layer on the client device. Los SDK de cliente de Azure Mobile Apps proporcionan una implementación de almacén local predeterminada.The Azure Mobile Apps client SDKs provide a default local store implementation. En Windows, Xamarin y Android, se basa en SQLite.On Windows, Xamarin and Android, it is based on SQLite. En iOS, se basa en Core Data.On iOS, it is based on Core Data.

Para usar la implementación basada en SQLite en Windows Phone o Microsoft Store, debe instalar una extensión de SQLite.To use the SQLite-based implementation on Windows Phone or Microsoft Store, you need to install a SQLite extension. Para obtener más información, consulte plataforma Universal de Windows: Habilitar la sincronización sin conexión. Android y iOS se distribuyen con una versión de SQLite en el sistema operativo del dispositivo, por lo que no es necesario hacer referencia a su propia versión de SQLite.For more information, see Universal Windows Platform: Enable offline sync. Android and iOS ship with a version of SQLite in the device operating system itself, so it is not necessary to reference your own version of SQLite.

Los desarrolladores también pueden implementar su propio almacén local.Developers can also implement their own local store. Por ejemplo, si desea almacenar los datos en un formato cifrado en el cliente móvil, puede definir un almacén local que use SQLCipher para el cifrado.For instance, if you wish to store data in an encrypted format on the mobile client, you can define a local store that uses SQLCipher for encryption.

¿Qué es un contexto de sincronización?What is a sync context?

Un contexto de sincronización está asociado a un objeto de cliente móvil (como IMobileServiceClient o MSClient) y realiza el seguimiento de los cambios que se realizan con las tablas de sincronización.A sync context is associated with a mobile client object (such as IMobileServiceClient or MSClient) and tracks changes that are made with sync tables. El contexto de sincronización mantiene una cola de operaciones que tiene una lista ordenada de operaciones CUD (creación, actualización, eliminación) que posteriormente se enviará al servidor.The sync context maintains an operation queue, which keeps an ordered list of CUD operations (Create, Update, Delete) that is later sent to the server.

Un almacén local se asocia con el contexto de sincronización mediante un método de inicialización como IMobileServicesSyncContext.InitializeAsync(localstore) en el SDK de cliente de .NET.A local store is associated with the sync context using an initialize method such as IMobileServicesSyncContext.InitializeAsync(localstore) in the .NET client SDK.

Funcionamiento de la sincronización sin conexiónHow offline synchronization works

Al usar tablas de sincronización, el código de cliente determina el momento en que se sincronizan los cambios locales con un back-end de Azure Mobile App.When using sync tables, your client code controls when local changes are synchronized with an Azure Mobile App backend. No se envía nada al back-end hasta que hay una llamada a los cambios locales de inserción .Nothing is sent to the backend until there is a call to push local changes. De forma similar, el almacén local se rellena con datos nuevos solo cuando hay una llamada a los datos de extracción .Similarly, the local store is populated with new data only when there is a call to pull data.

  • Envío de cambios: Inserción es una operación en el contexto de sincronización y envía todos los cambios CUD realizados desde la última inserción.Push: Push is an operation on the sync context and sends all CUD changes since the last push. Tenga en cuenta que no es posible enviar solo los cambios de una tabla individual porque las operaciones se podrían enviar desordenadas.Note that it is not possible to send only an individual table's changes, because otherwise operations could be sent out of order. La inserción ejecuta una serie de llamadas REST al back-end de Azure Mobile App, que a su vez, modifica la base de datos del servidor.Push executes a series of REST calls to your Azure Mobile App backend, which in turn modifies your server database.

  • Incorporación de cambios: Incorporación de cambios se realiza por tabla y se puede personalizar con una consulta para recuperar solo un subconjunto de los datos del servidor.Pull: Pull is performed on a per-table basis and can be customized with a query to retrieve only a subset of the server data. Luego, los SDK de cliente móvil de Azur insertan los datos que se obtienen en el almacén local.The Azure Mobile client SDKs then insert the resulting data into the local store.

  • Inserciones implícitas: Si se ejecuta una extracción en una tabla que tiene actualizaciones locales pendientes, la extracción ejecutará primero una push() en el contexto de sincronización.Implicit Pushes: If a pull is executed against a table that has pending local updates, the pull first executes a push() on the sync context. Esta inserción ayuda a minimizar los conflictos entre los cambios que ya están en cola y los datos nuevos del servidor.This push helps minimize conflicts between changes that are already queued and new data from the server.

  • Sincronización incremental: el primer parámetro de la operación de extracción es un nombre de consulta que solo se usa en el cliente.Incremental Sync: the first parameter to the pull operation is a query name that is used only on the client. Si usa un nombre de consulta no nulo, Azure Mobile SDK lleva a cabo una sincronización incremental. Cada vez que una operación de extracción devuelve un conjunto de resultados, la última marca de tiempo updatedAt de dicho conjunto se almacena en las tablas del sistema local del SDK.If you use a non-null query name, the Azure Mobile SDK performs an incremental sync. Each time a pull operation returns a set of results, the latest updatedAt timestamp from that result set is stored in the SDK local system tables. Las operaciones de extracción posteriores solo recuperarán registros después de esa marca de tiempo.Subsequent pull operations retrieve only records after that timestamp.

    Para usar la sincronización incremental, el servidor debe devolver valores updatedAt significativos y también admitir la ordenación mediante este campo.To use incremental sync, your server must return meaningful updatedAt values and must also support sorting by this field. Sin embargo, puesto que el SDK agrega su propio orden en el campo updatedAt, no puede usar una consulta de extracción que tenga su propia cláusula orderBy .However, since the SDK adds its own sort on the updatedAt field, you cannot use a pull query that has its own orderBy clause.

    El nombre de consulta puede ser cualquier cadena que elija, pero debe ser único para cada consulta lógica de la aplicación.The query name can be any string you choose, but it must be unique for each logical query in your app. De lo contrario, diferentes operaciones de extracción podrían sobrescribir la misma marca de tiempo de sincronización incremental y las consultas podrían devolver resultados incorrectos.Otherwise, different pull operations could overwrite the same incremental sync timestamp and your queries can return incorrect results.

    Si la consulta tiene un parámetro, una forma de crear un nombre de consulta único es incorporar el valor del parámetro.If the query has a parameter, one way to create a unique query name is to incorporate the parameter value. Por ejemplo, si está filtrando por userid, el nombre de consulta podría ser el siguiente (en C#):For instance, if you are filtering on userid, your query name could be as follows (in C#):

      await todoTable.PullAsync("todoItems" + userid,
          syncTable.Where(u => u.UserId == userid));
    

    Si desea cancelar la sincronización incremental, pase null como identificador de consulta.If you want to opt out of incremental sync, pass null as the query ID. En este caso, se recuperan todos los registros en cada llamada a PullAsync, que es potencialmente ineficaz.In this case, all records are retrieved on every call to PullAsync, which is potentially inefficient.

  • Purga: Puede borrar el contenido del almacén local mediante IMobileServiceSyncTable.PurgeAsync.Purging: You can clear the contents of the local store using IMobileServiceSyncTable.PurgeAsync. La purga puede ser necesaria si tiene datos obsoletos en la base de datos cliente o si desea descartar todos los cambios pendientes.Purging may be necessary if you have stale data in the client database, or if you wish to discard all pending changes.

    Una purga borra una tabla del almacén local.A purge clears a table from the local store. Si hay operaciones a la espera de sincronizarse con la base de datos del servidor, la purga genera una excepción, a menos que esté establecido el parámetro force purge.If there are operations awaiting synchronization with the server database, the purge throws an exception unless the force purge parameter is set.

    Como un ejemplo de datos obsoletos en el cliente, supongamos que en el ejemplo "lista de tareas pendientes", Dispositivo1 extrae solo los elementos que no se han completado.As an example of stale data on the client, suppose in the "todo list" example, Device1 only pulls items that are not completed. Otro dispositivo marca una tarea pendiente "Comprar leche" como completada en el servidor.A todoitem "Buy milk" is marked completed on the server by another device. Sin embargo, Dispositivo1 seguirá teniendo la tarea pendiente "Comprar leche" en el almacén local porque solo está extrayendo los elementos que no están marcados como completadosHowever, Device1 still has the "Buy milk" todoitem in local store because it is only pulling items that are not marked complete. Una purga borra este elemento obsoleto.A purge clears this stale item.

Pasos siguientesNext steps