Adicionar sincronização de dados offline ao aplicativo do Windows (WPF)

Nota

Este produto está desativado. Para obter uma substituição para projetos que usam o .NET 8 ou posterior, consulte a biblioteca datasync do Kit de Ferramentas da Comunidade .

Este tutorial aborda o recurso de sincronização offline dos Aplicativos Móveis do Azure para o aplicativo de início rápido do WPF. A sincronização offline permite que os usuários finais interajam com um aplicativo móvel , exibindo, adicionando ou modificando dados, mesmo quando não há nenhuma conexão de rede. As alterações são armazenadas em um banco de dados local. Depois que o dispositivo estiver online novamente, essas alterações serão sincronizadas com o back-end remoto.

Antes de iniciar este tutorial, você deve ter concluído o do Tutorial de Início Rápido do WPF, que inclui a criação de um serviço de back-end adequado. Também presumimos que você tenha adicionado de autenticação ao seu aplicativo. Você pode adicionar recursos offline ao seu aplicativo sem autenticação.

Atualizar o aplicativo para dar suporte à sincronização offline

Na operação online, você lê e grava de um IRemoteTable<T>. Ao usar a sincronização offline, você lê e grava de um IOfflineTable<T> em vez disso. O IOfflineTable<T> é apoiado por um banco de dados SQLite no dispositivo e sincronizado com o banco de dados de back-end.

Adicionar os pacotes NuGet necessários

No Visual Studio:

  1. Clique com o botão direito do mouse na solução TodoApp e selecione Gerenciar Pacotes NuGet para solução....

  2. Na nova guia, selecione Procurare, em seguida, insira Microsoft.Datasync.Client na caixa de pesquisa.

    Captura de tela da adição do NuGet offline no Visual Studio.

  3. Selecione o pacote de Microsoft.Datasync.Client.SQLiteStore.

  4. No painel direito, selecione todos os projetos cliente (exceto o projeto TodoAppService.NET6).

  5. Selecione Instalar.

  6. Aceite o contrato de licença quando solicitado.

Atualizar o cliente de serviço remoto

Abra o projeto de TodoApp.Data e localize a classe RemoteTodoService.cs (dentro do diretório Services). Atualize a classe da seguinte maneira:

  1. Adicione a seguinte instrução using à parte superior do arquivo:

    using Microsoft.Datasync.Client.SQLiteStore;
    
  2. Altere a definição de _table para ser um IOfflineTable<TodoItem>:

    /// <summary>
    /// Reference to the table used for datasync operations.
    /// </summary>
    private IOfflineTable<TodoItem> _table = null;
    
  3. Adicione uma nova propriedade para armazenar o local do banco de dados offline:

    /// <summary>
    /// The path to the offline database
    /// </summary>
    public string OfflineDb { get; set; }
    
  4. Atualize o método InitializeAsync para definir o banco de dados offline:

    // 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. Atualize o RefreshItemsAsync() para fazer a sincronização offline:

    /// <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;
    }
    

Definir o local do banco de dados offline

No projeto TodoApp.WPF, edite o arquivo App.xaml.cs. Altere a definição do RemoteTodoService da seguinte maneira:

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

Se você não concluiu o tutorial de autenticação , a definição deverá ter esta aparência:

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

Nota

Você pode armazenar o banco de dados offline onde quer que tenha permissões de leitura/gravação/criação em um sistema Windows. A classe Environment.SpecialFolder fornece locais padrão de acordo com o aplicativo.

Testar o aplicativo

O aplicativo não sincroniza com o back-end até que o ícone de atualização seja pressionado. Para testar:

  1. Abra o portal do Azure.

  2. Abra o grupo de recursos que contém os recursos para o início rápido.

  3. Selecione o banco de dados quickstart.

  4. Selecione o editor de consultas (versão prévia).

  5. Faça logon com a autenticação do SQL Server usando as mesmas credenciais que você configurou para o banco de dados.

    • Se necessário, você será solicitado a permitir o acesso ao seu endereço IP. Selecione o link para atualizar a lista de permissões e pressione OK para tentar novamente o logon.
  6. No editor de consultas, insira SELECT * FROM [dbo].[TodoItems]. Em seguida, selecione Executar.

Uma lista dos TodoItems atuais será exibida.

Captura de tela dos resultados no editor de consultas S Q L.

Agora, faça algumas alterações por meio do aplicativo. NÃO PRESSIONE DE ATUALIZAÇÃO (ainda).

Repita a instrução SQL no portal do Azure e verifique se nenhuma alteração foi feita nos dados no banco de dados.

Selecione o ícone Atualizar em seu aplicativo para efetuar push dos dados na fila para o serviço de back-end. Você verá as transações HTTP acontecendo na janela Depuração de Saída.

Repita a instrução SQL no portal do Azure e verifique se suas alterações foram enviadas por push para o serviço remoto.

Limpar recursos

A menos que você esteja fazendo outro tutorial de início rápido, exclua os recursos associados ao serviço de back-end agora.

  1. Abra o portal do Azure.
  2. Selecione o grupo de recursos que contém os recursos de início rápido.
  3. Selecione Excluir grupo de recursos.
  4. Siga as instruções para confirmar a exclusão.

Você também pode usar a CLI do Azure:

az group delete -g quickstart

Se você usou a CLI do Desenvolvedor do Azure para implantar recursos, poderá usar o comando azd down.

A exclusão levará alguns minutos para ser concluída.

Próximas etapas