Condividi tramite


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

Informazioni generali

Questa esercitazione presenta la funzionalità di sincronizzazione offline di App per dispositivi mobili di Azure per Xamarin.Android. 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.

In questa esercitazione si aggiorna il progetto client dall'esercitazione Creare un'app Xamarin Android per supportare le funzionalità offline di App per dispositivi mobili di Azure. Se non si usa il progetto server 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.

Aggiornare l'app client per supportare le funzionalità offline

Le funzionalità offline di App per dispositivi mobili di Azure consentono di interagire con un database locale quando si è in uno scenario offline. Per usare queste funzionalità nell'app, inizializza un SyncContext in un archivio locale. Fare quindi riferimento alla tabella tramite l'interfaccia IMobileServiceSyncTable. SQLite viene usato come archivio locale nel dispositivo.

  1. In Visual Studio, aprire la gestione pacchetti NuGet nel progetto che hai completato nell'esercitazione "Crea un'app Xamarin Android" . Cercate e installate il pacchetto NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Aprire il file ToDoActivity.cs e de-commentare la definizione #define OFFLINE_SYNC_ENABLED.
  3. In Visual Studio premere il tasto F5 per ricompilare ed eseguire l'app client. L'app funziona come prima di abilitare la sincronizzazione offline. Tuttavia, il database locale viene ora popolato con dati che possono essere usati in uno scenario offline.

Aggiornare l'app per disconnettersi dal back-end

In questa sezione si interrompe la connessione al back-end dell'app per dispositivi mobili per simulare una situazione offline. Quando si aggiungono elementi di dati, il gestore eccezioni indica che l'app è in modalità offline. In questo stato, i nuovi elementi vengono aggiunti nell'archivio locale e sincronizzati con il back-end dell'app per dispositivi mobili quando un push viene eseguito in uno stato di connessione.

  1. Modificare ToDoActivity.cs nel progetto condiviso. Modificare il applicationURL in modo che punti a un URL non valido:

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    È anche possibile dimostrare il comportamento offline disabilitando wi-fi e le reti cellulari nel dispositivo o utilizzando la modalità aereo.

  2. Premere F5 per compilare ed eseguire l'app. Si noti che la sincronizzazione non è riuscita al momento dell'aggiornamento, quando l'app è stata avviata.

  3. Immettere nuovi elementi e notare che il push ha esito negativo con uno stato [CancelledByNetworkError] ogni volta che si fa clic su Salva. Tuttavia, i nuovi elementi todo esistono nell'archivio locale fino a quando non possono essere inseriti nel back-end dell'app per dispositivi mobili. In un'app di produzione, se si eliminano queste eccezioni, l'app client si comporta come se fosse ancora connessa al back-end dell'app per dispositivi mobili.

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

  5. (Facoltativo) In Visual Studio, aprire l'Esplora server. Passare al database in azure- database SQL>. Fare clic con il pulsante destro del mouse sul database e selezionare Apri in Esplora oggetti di SQL Server. È ora possibile passare alla tabella di database SQL e al relativo contenuto. Verificare che i dati nel database back-end non siano stati modificati.

  6. (Facoltativo) Usare uno strumento REST, ad esempio Fiddler o Postman per eseguire query sul back-end per dispositivi mobili, usando una query GET nel modulo https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Aggiornare l'app per riconnettere il back-end dell'app per dispositivi mobili

In questa sezione riconnettere l'app al back-end dell'app per dispositivi mobili. Quando si esegue per la prima volta l'applicazione, il gestore eventi OnCreate chiama OnRefreshItemsSelected. Questo metodo chiama SyncAsync per sincronizzare l'archivio locale con il database back-end.

  1. ** Aprire ToDoActivity.cs nel progetto condiviso e annullare la modifica della proprietà applicationURL.

  2. Premere il tasto F5 per ricompilare ed eseguire l'app. L'app sincronizza le modifiche locali con il back-end dell'app per dispositivi mobili di Azure usando operazioni push e pull quando viene eseguito il metodo OnRefreshItemsSelected.

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

  4. Nell'app, cliccare sulla casella di controllo accanto ad alcuni elementi per completarli nel negozio locale.

    CheckItem chiama SyncAsync per sincronizzare ogni elemento completato con il back-end dell'app per dispositivi mobili. SyncAsync chiama sia push che pull. Ogni volta che si esegue un pull su una tabella a cui il client ha apportato modifiche, viene sempre eseguito automaticamente. In questo modo tutte le tabelle nell'archivio locale insieme alle relazioni rimangono coerenti. Questo comportamento può comportare un push imprevisto. Per altre informazioni su questo comportamento, vedere Sincronizzazione dati offline in App per dispositivi mobili di Azure.

Esaminare il codice di sincronizzazione client

Il progetto client Xamarin scaricato al termine dell'esercitazione Creare un'app Xamarin Android contiene già codice che supporta la sincronizzazione offline usando un database SQLite locale. Ecco una breve panoramica di ciò che è incluso già nel codice del tutorial. 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 quando ToDoActivity.OnCreate() esegue ToDoActivity.InitLocalStoreAsync(). Questo metodo crea un database SQLite locale usando la classe MobileServiceSQLiteStore fornita dall'SDK client di App per dispositivi mobili di Azure.

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

      // ToDoActivity.cs
      private async Task InitLocalStoreAsync()
      {
          // new code to initialize the SQLite store
          string path = Path.Combine(System.Environment
              .GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename);
    
          if (!File.Exists(path))
          {
              File.Create(path).Dispose();
          }
    
          var store = new MobileServiceSQLiteStore(path);
          store.DefineTable<ToDoItem>();
    
          // Uses the default conflict handler, which fails on conflict
          // To use a different conflict handler, pass a parameter to InitializeAsync.
          // For more details, see https://go.microsoft.com/fwlink/?LinkId=521416.
          await client.SyncContext.InitializeAsync(store);
      }
    
  • Il membro toDoTable di ToDoActivity è del tipo IMobileServiceSyncTable anziché di IMobileServiceTable. IMobileServiceSyncTable indirizza tutte le operazioni di tabella di creazione, lettura, aggiornamento ed eliminazione (CRUD) al database dell'archivio locale.

    Si decide quando viene eseguito il push delle modifiche nel back-end dell'app per dispositivi mobili di Azure chiamando IMobileServiceSyncContext.PushAsync(). Il contesto di sincronizzazione consente di mantenere le relazioni tra tabelle monitorando e eseguendo il push delle modifiche in tutte le tabelle modificate da un'app client quando viene chiamato PushAsync.

    Il codice fornito chiama ToDoActivity.SyncAsync() per la sincronizzazione ogni volta che l'elenco di elementi todoitem viene aggiornato o viene aggiunto o completato. Il codice viene sincronizzato dopo ogni modifica locale.

    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 ulteriori informazioni, consultare la sezione Sincronizzazione incrementale in Sincronizzazione dati offline nelle App per dispositivi mobili di Azure.

      // ToDoActivity.cs
      private async Task SyncAsync()
      {
          try {
              await client.SyncContext.PushAsync();
              await toDoTable.PullAsync("allTodoItems", toDoTable.CreateQuery()); // query ID is used for incremental sync
          } catch (Java.Net.MalformedURLException) {
              CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
          } catch (Exception e) {
              CreateAndShowDialog (e, "Error");
          }
      }
    

Risorse aggiuntive