Adición de sincronización de datos sin conexión a la aplicación de Xamarin.Forms

En este tutorial se explica la característica de sincronización sin conexión de Azure Mobile Apps para Xamarin.Forms. La sincronización sin conexión permite a los usuarios finales interactuar con una aplicación móvil (ver, agregar o modificar datos), incluso cuando no hay conexión de red. Los cambios se almacenan en una base de datos local. Una vez que el dispositivo se vuelve a conectar, estos cambios se sincronizan con el back-end remoto.

Antes de comenzar este tutorial, debe haber completado el tutorial de inicio rápido de Xamarin.Forms, que incluye la creación de un servicio back-end adecuado.

Para obtener más información acerca de la característica de sincronización sin conexión, consulte el tema Sincronización de datos sin conexión en Aplicaciones móviles de Azure.

Actualización de la aplicación para que admita la sincronización sin conexión

En la operación en línea, las lecturas y escrituras se realizan desde un elemento MobileServiceTable. En cambio, al usar la sincronización sin conexión, se realizan desde un elemento MobileServiceSyncTable. El elemento MobileServiceSyncTable está respaldo por una base de datos SQLite en el dispositivo, y se sincroniza con la base de datos back-end.

En la clase TodoService.cs:

  1. Actualice la definición de la variable mTable y agregue una definición para el almacén local. Comente la definición actual y quite los comentarios de la versión de sincronización sin conexión.

    // private IMobileServiceTable<TodoItem> mTable;
    private IMobileServiceSyncTable<TodoItem> mTable;
    private MobileServiceSQLiteStore mStore;
    

    Asegúrese de agregar las importaciones pertinentes mediante Alt+Entrar.

  2. Actualice el método InitializeAsync() para definir la versión sin conexión de la tabla:

    private async Task InitializeAsync()
    {
        using (await initializationLock.LockAsync())
        {
            if (!isInitialized)
            {
                // Create the client.
                mClient = new MobileServiceClient(Constants.BackendUrl, new LoggingHandler());
    
                // Define the offline store.
                mStore = new MobileServiceSQLiteStore("todoitems.db");
                mStore.DefineTable<TodoItem>();
                await mClient.SyncContext.InitializeAsync(mStore).ConfigureAwait(false);
    
                // Get a reference to the table.
                mTable = mClient.GetSyncTable<TodoItem>();
                isInitialized = true;
            }
        }
    }
    
  3. Reemplace el método SynchronizeAsync() que sincronizará los datos del almacén sin conexión con el almacén en línea:

    public async Task SynchronizeAsync()
    {
        await InitializeAsync().ConfigureAwait(false);
    
        IReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;
        try
        {
            await mClient.SyncContext.PushAsync().ConfigureAwait(false);
            await mTable.PullAsync("todoitems", mTable.CreateQuery()).ConfigureAwait(false);
        }
        catch (MobileServicePushFailedException error)
        {
            if (error.PushResult != null)
            {
                syncErrors = error.PushResult.Errors;
            }
        }
    
        if (syncErrors != null)
        {
            foreach (var syncError in syncErrors)
            {
                if (syncError.OperationKind == MobileServiceTableOperationKind.Update && syncError.Result != null)
                {
                    // Prefer server copy
                    await syncError.CancelAndUpdateItemAsync(syncError.Result).ConfigureAwait(false);
                }
                else
                {
                    // Discard local copy
                    await syncError.CancelAndDiscardItemAsync().ConfigureAwait(false);
                }
            }
        }
    }
    

Prueba de la aplicación

En esta sección, probará el comportamiento con la red Wi-FI activada y, después, la desactivará para crear un escenario sin conexión.

Los elementos de la lista de tareas pendientes se almacenan en una base de datos de SQLite en el dispositivo. Al actualizar los datos, los cambios se envían al servicio (inserción). A continuación, la aplicación solicita los nuevos elementos (extracción). En el tutorial, la actualización se selecciona presionando un icono o usando "deslizar para actualizar".

  1. Coloque el dispositivo o el simulador en Modo avión.
  2. Agregue algunos elementos ToDo o marque algunos elementos como completados.
  3. Salga del dispositivo o del simulador, o fuerce el cierre de la aplicación, y reinicie esta.
  4. Compruebe que se han guardado los cambios en el dispositivo.
  5. Consulte el contenido de la tabla TodoItem de Azure. Use una herramienta de SQL, como SQL Server Management Studio, o un cliente REST, como Fiddler o Postman. Compruebe que los nuevos elementos no se han sincronizado con el servidor.
  6. Active la red inalámbrica en el dispositivo o el simulador.
  7. Actualice los datos, ya sea mediante "deslizar para actualizar" o presionando el icono de actualización.
  8. Vuelva a revisar los datos de la tabla TodoItem. Ahora aparecerán los elementos nuevos y cambiados.

Pasos siguientes

Continúe con la implementación de la autenticación.