Adición de sincronización de datos sin conexión a la aplicación de Windows (WPF)

En este tutorial se explica la característica de sincronización sin conexión de Azure Mobile Apps para la aplicación de inicio rápido de WPF. 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 ninguna 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 WPF, que incluye la creación de un servicio back-end adecuado. También se supone que ha agregado autenticación a la aplicación. Puede agregar funcionalidades sin conexión a la aplicación sin autenticación.

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 IRemoteTable<T>. En cambio, al usar la sincronización sin conexión, se realizan desde un elemento IOfflineTable<T>. El elemento IOfflineTable<T> está respaldo por una base de datos SQLite en el dispositivo, y se sincroniza con la base de datos back-end.

Adición de los paquetes NuGet necesarios

En Visual Studio:

  1. Haga clic con el botón derecho en la TodoApp solución y seleccione Administrar paquetes NuGet para la solución....

  2. En la nueva pestaña, seleccione Examinar y escriba Microsoft.Datasync.Client en el cuadro de búsqueda.

    Screenshot of adding the offline NuGet in Visual Studio.

  3. Seleccione el paquete Microsoft.Datasync.Client.SQLiteStore.

  4. En el panel derecho, seleccione todos los proyectos cliente (excepto el TodoAppService.NET6 proyecto).

  5. Seleccione Instalar.

  6. Acepte el contrato de licencia cuando se le solicite.

Actualización del cliente de servicio remoto

Abra el TodoApp.Data proyecto y busque la RemoteTodoService.cs clase (dentro del Services directorio). Actualice la clase de la siguiente manera:

  1. Agregue la siguiente instrucción using al principio del archivo:

    using Microsoft.Datasync.Client.SQLiteStore;
    
  2. Cambie la definición de _table para que sea :IOfflineTable<TodoItem>

    /// <summary>
    /// Reference to the table used for datasync operations.
    /// </summary>
    private IOfflineTable<TodoItem> _table = null;
    
  3. Agregue una nueva propiedad para almacenar la ubicación de la base de datos sin conexión:

    /// <summary>
    /// The path to the offline database
    /// </summary>
    public string OfflineDb { get; set; }
    
  4. Actualice el InitializeAsync método para definir la base de datos sin conexión:

    // Create the offline store definition
    var connectionString = new UriBuilder { Scheme = "file", Path = OfflineDb, Query = "?mode=rwc" }.Uri.ToString();
    var store = new OfflineSQLiteStore(connectionString);
    store.DefineTable<TodoItem>();
    var options = new DatasyncClientOptions
    {
        OfflineStore = store,
        HttpPipeline = new HttpMessageHandler[] { new LoggingHandler() }
    };
    
    // Create the datasync client.
    _client = TokenRequestor == null 
        ? new DatasyncClient(Constants.ServiceUri, options)
        : new DatasyncClient(Constants.ServiceUri, new GenericAuthenticationProvider(TokenRequestor), options);
    
    // Initialize the database
    await _client.InitializeOfflineStoreAsync();
    
    // Get a reference to the offline table.
    _table = _client.GetOfflineTable<TodoItem>();
    
    // Set _initialized to true to prevent duplication of locking.
    _initialized = true;
    
  5. Actualice para realizar la RefreshItemsAsync() sincronización sin conexión:

    /// <summary>
    /// Refreshes the TodoItems list manually.
    /// </summary>
    /// <returns>A task that completes when the refresh is done.</returns>
    public async Task RefreshItemsAsync()
    {
        await InitializeAsync();
    
        // First, push all the items in the table.
        await _table.PushItemsAsync();
    
        // Then, pull all the items in the table.
        await _table.PullItemsAsync();
    
        return;
    }
    

Establecimiento de la ubicación de la base de datos sin conexión

En el TodoApp.WPF proyecto, edite el App.xaml.cs archivo. Cambie la definición de como RemoteTodoService se indica a continuación:

TodoService = new RemoteTodoService(async () => await GetAuthenticationToken())
{
    OfflineDb = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\offline.db"
};

Si no ha completado el tutorial de autenticación, la definición debe tener este aspecto en su lugar:

TodoService = new RemoteTodoService()
{
    OfflineDb = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\offline.db"
};

Nota:

Puede almacenar la base de datos sin conexión donde tenga permisos de lectura, escritura o creación en un sistema Windows. La Environment.SpecialFolder clase proporciona ubicaciones estándar según la aplicación.

Probar la aplicación

La aplicación no se sincroniza con el back-end hasta que se presiona el icono de actualización. Para probar:

  1. Abra Azure Portal.

  2. Abra el grupo de recursos que contiene los recursos del inicio rápido.

  3. Seleccione la quickstart base de datos.

  4. Seleccione el Editor de consultas (versión preliminar).

  5. Inicie sesión con la autenticación de SQL Server con las mismas credenciales que configuró para la base de datos.

    • Si es necesario, se le pedirá que permita el acceso a la dirección IP. Seleccione el vínculo para actualizar la lista de permitidos y presione Aceptar para volver a intentar el inicio de sesión.
  6. En el editor de consultas, escriba SELECT * FROM [dbo].[TodoItems]. Luego, seleccione Ejecutar.

Se mostrará una lista de todoItems actuales.

Screenshot of the results in the S Q L query editor.

Ahora, realice algunos cambios a través de la aplicación. NO PRESIONE ACTUALIZAR (todavía).

Repita la instrucción SQL en Azure Portal y compruebe que no se han realizado cambios en los datos de la base de datos.

Seleccione el icono Actualizar de la aplicación para insertar los datos en cola en el servicio back-end. Verá que las transacciones HTTP se producen en la ventana Depuración de salida.

Repita la instrucción SQL en Azure Portal y compruebe que los cambios se han insertado en el servicio remoto.

Limpieza de recursos

A menos que realice otro tutorial de inicio rápido, puede eliminar los recursos asociados al servicio back-end ahora.

  1. Abra Azure Portal.
  2. Seleccione el grupo de recursos que contiene los recursos de inicio rápido.
  3. Seleccione Eliminar grupo de recursos.
  4. Siga las instrucciones para confirmar la eliminación.

También puede usar la CLI de Azure:

az group delete -g quickstart

Si usó la CLI para desarrolladores de Azure para implementar recursos, puede usar el azd down comando en su lugar.

La eliminación tardará unos minutos en completarse.

Pasos siguientes