Habilitar sincronização offline para seu aplicativo móvel Xamarin.Forms
Visão geral
Este tutorial apresenta o recurso de sincronização offline de Aplicativos móveis do Azure para Xamarin.Forms. 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á conexão de rede. As alterações são armazenadas em um banco de dados local. Quando o dispositivo estiver online novamente, essas alterações serão sincronizadas com o serviço remoto.
Este tutorial se baseia na solução de início rápido do Xamarin.Forms para aplicativos móveis criados quando você conclui o tutorial [Criar um aplicativo iOS Xamarin]. A solução de início rápido para Xamarin.Forms contém o código para dar suporte à sincronização offline, que só precisa ser habilitada. Neste tutorial, você atualiza a solução de início rápido para ativar os recursos offline dos Aplicativos Móveis do Azure. Também destacamos o código especificamente offline no aplicativo. Se você não usar a solução de início rápido baixada, deverá adicionar os pacotes de extensão de acesso de dados autenticação ao seu projeto. Para obter mais informações sobre pacotes de extensão do servidor, confira Trabalhar com o servidor .NET back-end do SDK para Aplicativos Móveis do Azure.
Para saber mais sobre o recurso de sincronização offline, confira o tópico Sincronização de dados offline nos Aplicativos Móveis do Azure.
Habilitar a funcionalidade de sincronização offline na solução de início rápido
O código de sincronização offline é incluído no projeto usando diretivas de pré-processador C#. Quando o símbolo de OFFLINE_SYNC_ENABLED é definido, esses caminhos de código são incluídos na compilação. Para aplicativos do Windows, você deve instalar também a plataforma SQLite.
em Visual Studio, clique com o botão direito do mouse na solução >gerenciar pacotes de NuGet para a solução..., procure e instale o pacote de NuGet Microsoft. Azure. Mobile. Client. SQLiteStore para todos os projetos na solução.
No Gerenciador de Soluções, abra o arquivo TodoItemManager.cs do projeto com Portable no nome, que é o projeto da Biblioteca de Classes Portátil e remova o comentário da seguinte diretiva de pré-processador:
#define OFFLINE_SYNC_ENABLED
(Opcional) Para dar suporte a dispositivos Windows, instale um dos seguintes pacotes de runtime do SQLite:
Runtime do Windows 8.1: instalar o SQLite para Windows 8.1.
Windows Phone 8.1: instalar o SQLite para Windows Phone 8.1.
Plataforma Universal do Windows Instale o SQLite para a Plataforma Universal do Windows.
Embora o início rápido não contenha um projeto Universal do Windows, a plataforma Universal do Windows tem suporte com formulários do Xamarin.
Adicional em cada projeto de aplicativo Windows, clique com o botão direito do mouse em referências>adicionar referência..., expanda a Windowsextensõesde pasta > . Habilite o SDK do SQLite para Windows apropriado, junto com o SDK do Runtime do Visual C++ 2013 para Windows. Os nomes do SDK do SQLite variam ligeiramente de acordo com cada plataforma Windows.
Examine o código de sincronização do cliente
Aqui há uma breve visão geral do que já está incluído no código do tutorial nas diretivas do #if OFFLINE_SYNC_ENABLED
. A funcionalidade de sincronização offline está no arquivo de projeto TodoItemManager.cs no projeto da Biblioteca de Classes Portátil. Para obter uma visão geral conceitual do recurso, confira Sincronização de dados Offline em aplicativos móveis do Azure.
Antes de qualquer operação de tabela poder ser executada, o armazenamento local deve ser inicializado. O banco de dados de armazenamento local é inicializado no construtor da classe TodoItemManager usando 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 um novo banco de dados SQLite local usando a classe MobileServiceSQLiteStore.
O método DefineTable cria uma tabela no repositório local que corresponde aos campos no tipo fornecido. O tipo não precisa incluir todas as colunas que estão no banco de dados remoto. É possível armazenar um subconjunto de colunas.
O campo todoTable no TodoItemManager é um tipo IMobileServiceSyncTable em vez de IMobileServiceTable. Essa classe usa o banco de dados local para todas as operações de criação, leitura, atualização e exclusão (CRUD) de tabela. Você decide quando essas alterações são enviadas por push ao back-end do Aplicativo Móvel ao chamar PushAsync no IMobileServiceSyncContext. O contexto de sincronização ajuda a preservar relações da tabela controlando e enviando por push as alterações em todas as tabelas que um aplicativo cliente tenha modificado quando o PushAsync é chamado.
O método SyncAsync a seguir é chamado para sincronização com o back-end do Aplicativo 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"]); } } }
Este exemplo usa o tratamento de erros simples com o manipulador de sincronização padrão. Um aplicativo real trataria os diversos erros como condições de rede e conflitos de servidor usando uma personalização da implementação de IMobileServiceSyncHandler.
Considerações sobre a sincronização offline
No exemplo, o método SyncAsync é chamado somente na inicialização e quando a sincronização é solicitada. Para iniciar uma sincronização em um aplicativo Android ou iOS, puxe para baixo a lista de itens; para o Windows, use o botão Sincronizar. Em um aplicativo do mundo real, você também poderia fazer a sincronização disparar quando o estado da rede mudasse.
Quando um pull é executado em uma tabela que tenha atualizações locais pendentes controladas pelo contexto, e essa operação de pull automaticamente dispara um envio por push de contexto anterior. Durante a atualização, a adição e a conclusão de itens neste exemplo, você pode omitir a chamada explícita a PushAsync.
No código fornecido, todos os registros na tabela remota TodoItem são solicitados, mas também é possível filtrar os registros passando uma ID de consulta e uma consulta ao PushAsync. para obter mais informações, consulte a seção sincronização Incremental em Sincronização de Dados Offline em aplicativos móveis do Azure.
Execute o aplicativo cliente
Com a sincronização offline agora habilitada, execute o aplicativo cliente pelo menos uma vez em cada plataforma para preencher o banco de dados do armazenamento local. Posteriormente, simule um cenário offline e modificará os dados no armazenamento local enquanto o aplicativo estiver offline.
Atualize o comportamento de sincronização do aplicativo cliente
Nesta seção, modifique o projeto do cliente para simular um cenário offline usando uma URL de aplicativo inválida para o back-end. Como alternativa, você pode desativar as conexões de rede movendo o dispositivo para "modo avião". Quando você adiciona ou altera itens de dados, essas alterações são mantidas no repositório local, mas não sincronizadas com o armazenamento de dados de back-end até que a conexão seja restabelecida.
No Gerenciador de Soluções, abra o arquivo de projeto Constants.cs do projeto Portable e altere o valor de
ApplicationURL
para apontar para uma URL inválida:public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
Abra o arquivo TodoItemManager.cs do projeto Portable e adicione um catch à classe base Exception para o bloco try...catch em SyncAsync. Esse bloco catch grava a mensagem de exceção no console, da seguinte maneira:
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }
Compile e execute o aplicativo cliente. Adicione alguns novos itens. Observe que uma exceção será registrada no console para cada tentativa de sincronização com o back-end. Esses novos itens existem apenas no repositório local até que possam ser enviados por push para o serviço móvel. O aplicativo cliente se comporta como se estivesse conectado ao back-end, dando suporte a todas as operações CRUD (criar, ler, atualizar e excluir).
Feche o aplicativo e reinicie-o para verificar se os novos itens que você criou persistem no armazenamento local.
(Opcional) Use o Visual Studio para exibir a tabela de Banco de Dados SQL do Azure para ver se os dados no banco de dados do back-end não foram alterados.
No Visual Studio, abra Gerenciador de Servidores. navegue até o banco de dados no Azure- >SQL bancos dados. Clique com o botão direito do mouse em seu banco de dados e selecione Abrir no Pesquisador de Objetos do SQL Server. Agora você pode navegar até sua tabela de banco de dados SQL e seu conteúdo.
Atualize o aplicativo cliente para reconectar seu back-end móvel
Nesta seção, reconecte o aplicativo ao back-end móvel, que simula o aplicativo voltando ao estado online. Quando você executa o gesto de atualização, os dados são sincronizados com o serviço móvel.
Reabra Constants.cs. Corrija o
applicationURL
de modo que ele aponte para a URL correta.Recompile e execute o aplicativo cliente. O aplicativo tenta sincronizar com o back-end do aplicativo móvel após iniciar. Verifique se nenhuma exceção está registrada no console de depuração.
(Opcional) Exiba os dados atualizados usando o Pesquisador de Objetos do SQL Server ou uma ferramenta REST, como o Fiddler ou Postman. Observe que os dados foram sincronizados entre o banco de dados de back-end e o repositório local.
Observe que os dados foram sincronizados entre o banco de dados e o armazenamento local e contém os itens que você adicionou enquanto seu aplicativo estava desconectado.