Delen via


Offlinesynchronisatie inschakelen voor uw mobiele Xamarin.Forms-app

Overzicht

In deze zelfstudie maakt u kennis met de offlinesynchronisatiefunctie van Azure Mobile Apps voor Xamarin.Forms. Met offlinesynchronisatie kunnen eindgebruikers communiceren met een mobiele app die gegevens bekijkt, toevoegt of wijzigt, zelfs als er geen netwerkverbinding is. Wijzigingen worden opgeslagen in een lokale database. Zodra het apparaat weer online is, worden deze wijzigingen gesynchroniseerd met de externe service.

Deze zelfstudie is gebaseerd op de quickstart-oplossing Xamarin.Forms voor Mobile Apps die u maakt wanneer u de zelfstudie voltooit [Een Xamarin iOS-app maken]. De quickstart-oplossing voor Xamarin.Forms bevat de code ter ondersteuning van offlinesynchronisatie, die alleen moet worden ingeschakeld. In deze zelfstudie werkt u de quickstart-oplossing bij om de offlinefuncties van Azure Mobile Apps in te schakelen. We duiden ook de offline-specifieke code in de app aan. Als u de gedownloade quickstart-oplossing niet gebruikt, moet u de extensiepakketten voor gegevenstoegang toevoegen aan uw project. Zie Werken met de SDK van de .NET-back-endserver voor Azure Mobile Appsvoor meer informatie over serveruitbreidingspakketten.

Zie het onderwerp Offline Data Sync in Azure Mobile Appsvoor meer informatie over de functie voor offlinesynchronisatie.

Offlinesynchronisatiefunctionaliteit inschakelen in de quickstart-oplossing

De offlinesynchronisatiecode wordt in het project opgenomen met behulp van C#-preprocessorrichtlijnen. Wanneer het OFFLINE_SYNC_ENABLED symbool is gedefinieerd, worden deze codepaden opgenomen in de build. Voor Windows-apps moet u ook het SQLite-platform installeren.

  1. Klik in Visual Studio met de rechtermuisknop op de oplossing >NuGet-pakketten voor oplossing beheren..., zoek en installeer vervolgens het Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-pakket voor alle projecten in de oplossing.

  2. Open in Solution Explorer het bestand TodoItemManager.cs van het project met Portable in de naam, dat het project Portable Class Library is, en verwijder vervolgens de opmerkingen bij de volgende preprocessorrichtlijn:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Optioneel) Installeer een van de volgende SQLite Runtime-pakketten om Windows-apparaten te ondersteunen:

  4. (Optioneel) Klik in elk Windows-app-project met de rechtermuisknop op Verwijzingen>Verwijzing toevoegen..., vouw de Windows-map >Extensies uit. Schakel de juiste SQLite voor Windows SDK in, samen met de Visual C++ 2013 Runtime voor Windows SDK. De SQLite SDK-namen verschillen enigszins met elk Windows-platform.

De clientsynchronisatiecode controleren

Hier is een kort overzicht van wat al in de zelfstudiecode is opgenomen binnen de #if OFFLINE_SYNC_ENABLED-richtlijnen. De offlinesynchronisatiefunctionaliteit bevindt zich in het TodoItemManager.cs projectbestand in het project Portable Class Library. Zie Offline Data Sync in Azure Mobile Appsvoor een conceptueel overzicht van de functie.

  • Voordat tabelbewerkingen kunnen worden uitgevoerd, moet de lokale opslag worden geïnitialiseerd. De lokale archiefdatabase wordt geïnitialiseerd in de klasseconstructor TodoItemManager met behulp van de volgende code:

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

    Met deze code maakt u een nieuwe lokale SQLite-database met behulp van de klasse MobileServiceSQLiteStore .

    Met de methode DefineTable maakt u een tabel in de lokale opslag dat overeenkomt met de velden in het opgegeven type. Het type hoeft niet alle kolommen in de externe database op te nemen. Het is mogelijk om een subset van kolommen op te slaan.

  • Het veld todoTable in TodoItemManager is een type IMobileServiceSyncTable in plaats van IMobileServiceTable. Deze klasse maakt gebruik van de lokale database voor alle CRUD-tabelbewerkingen (create, read, update en delete). U bepaalt wanneer deze wijzigingen naar de back-end van de mobiele app worden gepusht door PushAsync aan te roepen op de IMobileServiceSyncContext. De synchronisatiecontext helpt tabelrelaties te behouden door wijzigingen in alle tabellen bij te houden en te pushen die een client-app heeft gewijzigd wanneer PushAsync wordt aangeroepen.

    De volgende SyncAsync-methode wordt aangeroepen om te synchroniseren met de back-end van de mobiele app:

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

    In dit voorbeeld wordt gebruikgemaakt van eenvoudige foutafhandeling met de standaardsynchronisatiehandler. Een echte toepassing verwerkt de verschillende fouten, zoals netwerkomstandigheden en serverconflicten met behulp van een aangepaste IMobileServiceSyncHandler-implementatie .

Overwegingen voor offlinesynchronisatie

In het voorbeeld wordt de SyncAsync-methode alleen aangeroepen bij het opstarten en wanneer een synchronisatie wordt aangevraagd. Als u een synchronisatie wilt initiëren in een Android- of iOS-app, trekt u de itemslijst omlaag; Voor Windows gebruikt u de knop Synchroniseren . In een echte toepassing kunt u ook de synchronisatietrigger aanbrengen wanneer de netwerkstatus verandert.

Wanneer een pull wordt uitgevoerd op basis van een tabel die lokale updates in behandeling heeft die door de context worden bijgehouden, activeert die pull-bewerking automatisch een voorafgaande contextpush. Wanneer u items in dit voorbeeld vernieuwt, toevoegt en voltooit, kunt u de expliciete PushAsync-aanroep weglaten.

In de opgegeven code worden alle records in de externe todoItem-tabel opgevraagd, maar het is ook mogelijk om records te filteren door een query-id en query door te geven aan PushAsync. Zie de sectie Incrementele synchronisatie in Offline Data Sync in Azure Mobile Appsvoor meer informatie.

De client-app uitvoeren

Als offlinesynchronisatie nu is ingeschakeld, voert u de clienttoepassing ten minste één keer uit op elk platform om de lokale archiefdatabase te vullen. Later simuleert u een offlinescenario en wijzigt u de gegevens in de lokale store terwijl de app offline is.

Het synchronisatiegedrag van de client-app bijwerken

In deze sectie wijzigt u het clientproject om een offlinescenario te simuleren met behulp van een ongeldige toepassings-URL voor uw back-end. U kunt ook netwerkverbindingen uitschakelen door uw apparaat naar 'Vliegtuigstand' te verplaatsen. Wanneer u gegevensitems toevoegt of wijzigt, worden deze wijzigingen bewaard in het lokale archief, maar niet gesynchroniseerd met het back-endgegevensarchief totdat de verbinding opnieuw tot stand is gebracht.

  1. Open in de Solution Explorer het projectbestand Constants.cs van het Portable-project en wijzig de waarde van ApplicationURL naar een ongeldige URL.

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Open het TodoItemManager.cs-bestand vanuit het Portable-project en voeg vervolgens een catch voor de basisuitzonderingsklasse toe aan het proberen... catch block in SyncAsync. Met dit catch-blok wordt het uitzonderingsbericht als volgt naar de console geschreven:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Bouw en voer de client-app uit. Voeg enkele nieuwe items toe. U ziet dat er een uitzondering is geregistreerd in de console voor elke poging om te synchroniseren met de back-end. Deze nieuwe items bestaan alleen in de lokale opslag totdat ze naar de mobiele back-end kunnen worden doorgestuurd. De client-app gedraagt zich alsof deze is verbonden met de back-end, met ondersteuning voor alle CRUD-bewerkingen (create, read, update, delete).

  4. Sluit de app en start deze opnieuw om te controleren of de nieuwe items die u hebt gemaakt, behouden blijven in de lokale store.

  5. (Optioneel) Gebruik Visual Studio om uw Azure SQL Database-tabel weer te geven om te zien dat de gegevens in de back-enddatabase niet zijn gewijzigd.

    Open Server Explorer in Visual Studio. Navigeer naar uw database in Azure->SQL Databases. Klik met de rechtermuisknop op de database en selecteer Openen in SQL Server Object Explorer. U kunt nu naar uw SQL-databasetabel en de inhoud ervan bladeren.

De client-app bijwerken om opnieuw verbinding te maken met uw mobiele back-end

In deze sectie verbindt u de app opnieuw met de mobiele backend, wat simuleert dat de app weer online is. Wanneer u de vernieuwingsbeweging uitvoert, worden gegevens gesynchroniseerd met uw mobiele back-end.

  1. Open Constants.cs opnieuw. Corrigeer het applicationURL om naar de juiste URL te verwijzen.

  2. Bouw de client-app opnieuw en voer deze uit. De app probeert te synchroniseren met de back-end van de mobiele app na het starten. Controleer of er geen uitzonderingen zijn vastgelegd in de console voor foutopsporing.

  3. (Optioneel) Bekijk de bijgewerkte gegevens met behulp van SQL Server Object Explorer of een REST-hulpprogramma, zoals Fiddler of Postman. U ziet dat de gegevens zijn gesynchroniseerd tussen de back-enddatabase en het lokale archief.

    U ziet dat de gegevens zijn gesynchroniseerd tussen de database en het lokale archief en de items bevat die u hebt toegevoegd terwijl de verbinding met uw app is verbroken.

Aanvullende informatiebronnen