Ative a sincronização offline para a sua aplicação móvel Xamarin.Forms

Descrição Geral

Este tutorial introduz a funcionalidade de sincronização offline de Azure Mobile Apps for Xamarin.Forms. A sincronização offline permite que os utilizadores finais interajam com uma aplicação móvel-visualização, adição ou modificação de dados -- mesmo quando não há ligação à rede. As alterações são armazenadas numa base de dados local. Uma vez que o dispositivo está novamente on-line, estas alterações são sincronizadas com o serviço remoto.

Este tutorial baseia-se na solução quickstart Xamarin.Forms para aplicações móveis que cria quando completa o tutorial [Criar uma aplicação Xamarin iOS]. A solução quickstart para Xamarin.Forms contém o código para suportar a sincronização offline, que apenas precisa de ser ativada. Neste tutorial, atualize a solução quickstart para ligar as funcionalidades offline das Aplicações Azure Mobile. Destacamos também o código específico offline na aplicação. Se não utilizar a solução de arranque rápido descarregada, tem de adicionar os pacotes de extensão de acesso a dados ao seu projeto. Para obter mais informações sobre pacotes de extensão do servidor, consulte Work with the .NET backend server SDK for Azure Mobile Apps.

Para saber mais sobre a funcionalidade de sincronização offline, consulte o tópico Offline Sincronização de Dados em Azure Mobile Apps.

Ativar a funcionalidade de sincronização offline na solução quickstart

O código de sincronização offline está incluído no projeto utilizando diretivas pré-processuais C#. Quando o símbolo OFFLINE_SYNC_ENABLED é definido, estes caminhos de código são incluídos na construção. Para Windows aplicações, também deve instalar a plataforma SQLite.

  1. Em Visual Studio, clique com Visual Studio à direita na solução >Gerir pacotes NuGet para solução..., em seguida, procurar e instalar o pacote Microsoft.Azure.Mobile.Client.SQLiteStore NuGet para todos os projetos na solução.

  2. No Explorador de Soluções, abra o arquivo TodoItemManager.cs do projeto com Portátil no nome, que é o projeto Portátil Class Library, e depois descomprometendo a seguinte diretiva pré-processuador:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Opcional) Para suportar Windows dispositivos, instale um dos seguintes pacotes de tempo de execução SQLite:

  4. (Opcional) Em cada Windows projeto de aplicação, clique à direita ReferênciasAdd>Reference..., expandir as extensões de pasta > Windows. Ativar o SQLite apropriado para Windows SDK juntamente com o Tempo de Execução Visual C++ 2013 para Windows SDK. Os nomes SQLite SDK variam ligeiramente com cada Windows plataforma.

Reveja o código de sincronização do cliente

Eis uma breve visão geral do que já está incluído no código tutorial no interior das #if OFFLINE_SYNC_ENABLED diretivas. A funcionalidade de sincronização offline está no todoItemManager.cs ficheiro de projeto no projeto Da Biblioteca de Classes Portáteis. Para uma visão geral conceptual da funcionalidade, consulte offline Sincronização de Dados em Azure Mobile Apps.

  • Antes de qualquer funcionação de mesa, a loja local deve ser inicializada. A base de dados de loja local é inicializada no construtor de classe TodoItemManager utilizando o seguinte código:

      var store = new MobileServiceSQLiteStore(OfflineDbPath);
      store.DefineTable<TodoItem>();
    
      //Initializes the SyncContext using the default IMobileServiceSyncHandler.
      this.client.SyncContext.InitializeAsync(store);
    
      this.todoTable = client.GetSyncTable<TodoItem>();
    

    Este código cria uma nova base de dados SQLite local utilizando a classe MobileServiceSQLiteStore .

    O método DefineTable cria uma tabela na loja local que corresponde aos campos do tipo fornecido. O tipo não tem de incluir todas as colunas que estão na base de dados remota. É possível armazenar um subconjunto de colunas.

  • O campo todoTable em TodoItemManager é um tipo IMobileServiceSyncTable em vez de IMobileServiceTable. Esta classe utiliza a base de dados local para todas as operações de tabela de criação, leitura, atualização e exclusão (CRUD). Você decide quando essas alterações são empurradas para o backend da Aplicação Móvel, ligando para o PushAsync no IMobileServiceSyncContext. O contexto de sincronização ajuda a preservar as relações de mesa, rastreando e empurrando mudanças em todas as tabelas que uma aplicação do cliente modificou quando o PushAsync é chamado.

    O seguinte método SyncAsync é chamado para sincronizar com o backend da Aplicação Móvel:

      public async Task SyncAsync()
      {
          ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;
    
          try
          {
              await this.client.SyncContext.PushAsync();
    
              await this.todoTable.PullAsync(
                  "allTodoItems",
                  this.todoTable.CreateQuery());
          }
          catch (MobileServicePushFailedException exc)
          {
              if (exc.PushResult != null)
              {
                  syncErrors = exc.PushResult.Errors;
              }
          }
    
          // Simple error/conflict handling.
          if (syncErrors != null)
          {
              foreach (var error in syncErrors)
              {
                  if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
                  {
                      //Update failed, reverting to server's copy.
                      await error.CancelAndUpdateItemAsync(error.Result);
                  }
                  else
                  {
                      // Discard local change.
                      await error.CancelAndDiscardItemAsync();
                  }
    
                  Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.",
                      error.TableName, error.Item["id"]);
              }
          }
      }
    

    Esta amostra utiliza um simples manuseamento de erros com o manipulador de sincronização padrão. Uma aplicação real lidaria com os vários erros, como condições de rede e conflitos de servidores, utilizando uma implementação personalizada do IMobileServiceSyncHandler .

Considerações de sincronização offline

Na amostra, o método SyncAsync só é chamado para o arranque e quando é solicitada uma sincronização. Para iniciar uma sincronização numa aplicação Android ou iOS, puxe para baixo na lista de itens; para Windows, utilize o botão Sync. Numa aplicação no mundo real, também pode fazer o gatilho de sincronização quando o estado da rede muda.

Quando um puxão é executado contra uma tabela que tem atualizações locais pendentes rastreadas pelo contexto, essa operação de puxar automaticamente desencadeia um impulso de contexto anterior. Ao refrescar, adicionar e completar itens nesta amostra, pode omitir a chamada pushAsync explícita.

No código fornecido, todos os registos na tabela todoItem remota são consultados, mas também é possível filtrar registos passando um id de consulta e consulta para PushAsync. Para mais informações, consulte a secção Incremental Sync em offline Sincronização de Dados em Azure Mobile Apps.

Executar a aplicação do cliente

Com a sincronização offline agora ativada, execute a aplicação do cliente pelo menos uma vez em cada plataforma para preencher a base de dados da loja local. Mais tarde, simular um cenário offline e modificar os dados na loja local enquanto a aplicação estiver offline.

Atualizar o comportamento sincronizado da aplicação do cliente

Nesta secção, modifique o projeto do cliente para simular um cenário offline utilizando um URL de aplicação inválido para o seu backend. Em alternativa, pode desligar as ligações de rede movendo o seu dispositivo para "Modo Avião". Quando adiciona ou altera os itens de dados, estas alterações são mantidas na loja local, mas não sincronizadas na loja de dados de backend até que a ligação seja restabelecida.

  1. No Explorador de Soluções, abra o ficheiro de projeto Constants.cs a partir do projeto Portátil e altere o valor de ApplicationURL apontar para um URL inválido:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Abra o arquivo todoItemManager.cs do projeto Portátil e, em seguida, adicione uma captura para a classe de exceção base à tentativa... bloco de captura em SyncAsync. Este bloco de capturas escreve a mensagem de exceção para a consola, da seguinte forma:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Construa e execute a aplicação do cliente. Adicione alguns itens novos. Note que é registada uma exceção na consola para cada tentativa de sincronização com o backend. Estes novos itens só existem na loja local até que possam ser empurrados para o backend móvel. A aplicação do cliente comporta-se como se estivesse ligada ao backend, suportando todas as operações de criação, leitura, atualização, eliminação (CRUD).

  4. Feche a aplicação e reinicie-a para verificar se os novos itens que criou são persistidos na loja local.

  5. (Opcional) Utilize Visual Studio para ver a sua tabela Base de Dados SQL do Azure para ver se os dados na base de dados de backend não foram alterados.

    Em Visual Studio, abra o Server Explorer. Navegue na sua base de dados em Azure-SQL Bases de> Dados. Clique com o botão direito na sua base de dados e selecione Abrir em SQL Server Object Explorer. Agora pode navegar para a sua SQL tabela de bases de dados e o seu conteúdo.

Atualize a app do cliente para reconectar o seu backend móvel

Nesta secção, volte a ligar a app ao backend móvel, que simula o regresso da app a um estado online. Quando executa o gesto de atualização, os dados são sincronizados com o seu backend móvel.

  1. Reabrir Constants.cs. Corrija o applicationURL para apontar para o URL correto.

  2. Reconstruir e executar a aplicação do cliente. A aplicação tenta sincronizar-se com o backend da aplicação móvel após o lançamento. Verifique se não há exceções registadas na consola de depuração.

  3. (Opcional) Ver os dados atualizados utilizando SQL Server Object Explorer ou uma ferramenta REST como o Fiddler ou o Carteiro. Note que os dados foram sincronizados entre a base de dados de backend e a loja local.

    Note que os dados foram sincronizados entre a base de dados e a loja local e contém os itens que adicionou enquanto a sua aplicação foi desligada.

Recursos Adicionais