Condividi tramite


Abilitare la sincronizzazione offline per l'app per dispositivi mobili Xamarin.Forms

Informazioni generali

Questa esercitazione presenta la funzionalità di sincronizzazione offline di App per dispositivi mobili di Azure per Xamarin.Forms. La sincronizzazione offline consente agli utenti finali di interagire con un'app per dispositivi mobili, aggiungendo o modificando i dati, anche quando non è presente alcuna connessione di rete. Le modifiche vengono archiviate in un database locale. Una volta che il dispositivo è di nuovo online, queste modifiche vengono sincronizzate con il servizio remoto.

Questa esercitazione si basa sulla soluzione di avvio rapido di Xamarin.Forms per le app per dispositivi mobili create al termine dell'esercitazione [Creare un'app Xamarin iOS]. La soluzione di avvio rapido per Xamarin.Forms contiene il codice per supportare la sincronizzazione offline, che deve essere abilitata. In questa esercitazione si aggiorna la soluzione di avvio rapido per attivare le funzionalità offline di App per dispositivi mobili di Azure. Evidenziamo anche il codice specifico della modalità offline nell'app. Se non si usa la soluzione di avvio rapido scaricato, è necessario aggiungere i pacchetti di estensione per l'accesso ai dati al progetto. Per altre informazioni sui pacchetti di estensione server, vedere Usare l'SDK del server back-end .NET per app per dispositivi mobili di Azure.

Per altre informazioni sulla funzionalità di sincronizzazione offline, vedere l'argomento Sincronizzazione dati offline in App per dispositivi mobili di Azure.

Abilitare la funzionalità di sincronizzazione offline nella soluzione di avvio rapido

Il codice di sincronizzazione offline è incluso nel progetto usando le direttive del preprocessore C#. Quando viene definito il simbolo OFFLINE_SYNC_ENABLED , questi percorsi di codice vengono inclusi nella compilazione. Per le app di Windows, è necessario installare anche la piattaforma SQLite.

  1. In Visual Studio fare clic con il pulsante destro del mouse sulla soluzione Gestisci pacchetti NuGet per la soluzione>, quindi cercare e installare il pacchetto NuGet Microsoft.Azure.Mobile.Client.SQLiteStore per tutti i progetti nella soluzione.

  2. Nell'Esplora soluzioni aprire il file TodoItemManager.cs dal progetto con Portable nel nome, ovvero la Libreria di classi Portable, quindi decommentare la seguente direttiva del preprocessore:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Facoltativo) Per supportare i dispositivi Windows, installare uno dei pacchetti di runtime SQLite seguenti:

  4. (Facoltativo) In ogni progetto di app di Windows, fare clic con il pulsante destro del mouse su Riferimenti>Aggiungi riferimento..., espandere la cartella Windows>Estensioni. Abilitare l'SQLite for Windows SDK appropriato insieme al Visual C++ 2013 Runtime for Windows SDK. I nomi di SQLite SDK variano leggermente con ogni piattaforma Windows.

Esaminare il codice di sincronizzazione client

Ecco una breve panoramica di ciò che è già incluso nel codice tutorial all'interno delle #if OFFLINE_SYNC_ENABLED tag. La funzionalità di sincronizzazione offline si trova nel file di progetto TodoItemManager.cs nel progetto Libreria di classi portabile. Per una panoramica concettuale della funzionalità, vedere Sincronizzazione dati offline in App per dispositivi mobili di Azure.

  • Prima di eseguire qualsiasi operazione di tabella, è necessario inizializzare l'archivio locale. Il database dell'archivio locale viene inizializzato nel costruttore della classe TodoItemManager usando il codice seguente:

      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>();
    

    Questo codice crea un nuovo database SQLite locale usando la classe MobileServiceSQLiteStore .

    Il metodo DefineTable crea una tabella nell'archivio locale che corrisponde ai campi nel tipo specificato. Il tipo non deve includere tutte le colonne presenti nel database remoto. È possibile archiviare un subset di colonne.

  • Il campo todoTable in TodoItemManager è un tipo IMobileServiceSyncTable anziché IMobileServiceTable. Questa classe usa il database locale per tutte le operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD). Si decide quando queste modifiche vengono spostate nel back-end dell'app per dispositivi mobili chiamando PushAsync in IMobileServiceSyncContext. Il contesto di sincronizzazione consente di mantenere le relazioni tra tabelle monitorando ed eseguendo il push delle modifiche in tutte le tabelle modificate da un'app client quando viene chiamato PushAsync .

    Il metodo SyncAsync seguente viene chiamato per la sincronizzazione con il back-end dell'app per dispositivi mobili:

      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"]);
              }
          }
      }
    

    Questo esempio usa una gestione degli errori semplice con il gestore di sincronizzazione predefinito. Un'applicazione reale gestirà i vari errori, ad esempio condizioni di rete e conflitti tra server, usando un'implementazione IMobileServiceSyncHandler personalizzata.

Considerazioni sulla sincronizzazione offline

Nell'esempio il metodo SyncAsync viene chiamato solo all'avvio e quando viene richiesta una sincronizzazione. Per avviare una sincronizzazione in un'app Android o iOS, trascinare verso il basso nell'elenco elementi; per Windows, usare il pulsante Sincronizza . In un'applicazione reale è anche possibile attivare la sincronizzazione quando lo stato della rete cambia.

Quando un pull viene eseguito su una tabella con aggiornamenti locali in sospeso rilevati dal contesto, tale operazione di pull attiva automaticamente un push del contesto precedente. Durante l'aggiornamento, l'aggiunta e il completamento di elementi in questo esempio, è possibile omettere la chiamata pushAsync esplicita.

Nel codice fornito vengono eseguite query su tutti i record nella tabella TodoItem remota, ma è anche possibile filtrare i record passando un ID di query e una query a PushAsync. Per altre informazioni, vedere la sezione Sincronizzazione incrementale in Sincronizzazione dati offline in App per dispositivi mobili di Azure.

Eseguire l'app client

Con la sincronizzazione offline ora abilitata, eseguire l'applicazione client almeno una volta in ogni piattaforma per popolare il database dell'archivio locale. Successivamente, simulare uno scenario offline e modificare i dati nell'archivio locale mentre l'app è offline.

Aggiornare il comportamento di sincronizzazione dell'app client

In questa sezione modifica il progetto client per simulare uno scenario offline usando un URL non valido dell'applicazione per il back-end. In alternativa, è possibile disattivare le connessioni di rete spostando il dispositivo in "Modalità aereo". Quando si aggiungono o si modificano elementi di dati, queste modifiche vengono mantenute nell'archivio locale, ma non sincronizzate con l'archivio dati back-end fino a quando la connessione non viene ristabilita.

  1. In Esplora soluzioni aprire il file di progetto Constants.cs dal progetto Portabile e modificare il valore di ApplicationURL in modo che punti a un URL non valido:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Aprire il file TodoItemManager.cs dal progetto Portable, quindi aggiungere un catch per la classe di base Exception al blocco try...catch in SyncAsync. Questo blocco catch scrive il messaggio di eccezione nella console, come indicato di seguito:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Compilare ed eseguire l'app client. Aggiungere alcuni nuovi elementi. Si noti che viene registrata un'eccezione nella console per ogni tentativo di sincronizzazione con il back-end. Questi nuovi elementi esistono solo nell'archivio locale fino a quando non possono essere inseriti nel back-end per dispositivi mobili. L'app client si comporta come se fosse connessa al back-end, supportando tutte le operazioni crud (Create, Read, Update, Delete).

  4. Chiudere l'app e riavviarla per verificare che i nuovi elementi creati siano persistenti nell'archivio locale.

  5. (Facoltativo) Usare Visual Studio per visualizzare la tabella del database SQL di Azure per verificare che i dati nel database back-end non siano stati modificati.

    In Visual Studio, apri Esplora Server. Passare al proprio database in Azure>SQL Databases. Fare clic con il pulsante destro del mouse sul database e scegliere Apri in Esplora oggetti di SQL Server. È ora possibile passare alla tabella di database SQL e al relativo contenuto.

Aggiornare l'app client per riconnettere il back-end mobile

In questa sezione riconnettere l'app al back-end per dispositivi mobili, che simula il ritorno dell'app a uno stato online. Quando si esegue il movimento di aggiornamento, i dati vengono sincronizzati con il back-end mobile.

  1. Riaprire Constants.cs. Correggere il applicationURL affinché punti all'URL corretto.

  2. Ricompilare ed eseguire l'app client. L'app tenta di eseguire la sincronizzazione con il back-end dell'app per dispositivi mobili dopo l'avvio. Verificare che nella console di debug non siano registrate eccezioni.

  3. (Facoltativo) Visualizzare i dati aggiornati usando Esplora oggetti di SQL Server o uno strumento REST come Fiddler o Postman. Si noti che i dati sono stati sincronizzati tra il database back-end e l'archivio locale.

    Si noti che i dati sono stati sincronizzati tra il database e l'archivio locale e contengono gli elementi aggiunti durante la disconnessione dell'app.

Risorse aggiuntive