Aktivera offlinesynkronisering för din Xamarin.Forms-mobilapp

Översikt

I den här självstudien introduceras offlinesynkroniseringsfunktionen i Azure Mobile Apps för Xamarin.Forms. Med offlinesynkronisering kan slutanvändare interagera med en mobilapp – visa, lägga till eller ändra data – även om det inte finns någon nätverksanslutning. Ändringar lagras i en lokal databas. När enheten är online igen synkroniseras ändringarna med fjärrtjänsten.

Den här självstudien baseras på Xamarin.Forms snabbstartslösning för Mobile Apps som du skapar när du slutför självstudien [Skapa en Xamarin iOS-app]. Snabbstartslösningen för Xamarin.Forms innehåller koden för offlinesynkronisering, som bara behöver aktiveras. I den här självstudien uppdaterar du snabbstartslösningen för att aktivera offlinefunktionerna i Azure Mobile Apps. Vi markerar även den offlinespecifika koden i appen. Om du inte använder den nedladdade snabbstartslösningen måste du lägga till dataåtkomsttilläggspaketen i projektet. Mer information om servertilläggspaket finns i Arbeta med SDK för .NET-serverserver för Azure Mobile Apps.

Mer information om offlinesynkroniseringsfunktionen finns i avsnittet Offline Data Sync i Azure Mobile Apps.

Aktivera offlinesynkroniseringsfunktioner i snabbstartslösningen

Offlinesynkroniseringskoden ingår i projektet med hjälp av C#-förprocessordirektiv. När OFFLINE_SYNC_ENABLED har definierats inkluderas dessa kodsökvägar i versionen. För Windows-appar måste du även installera SQLite-plattformen.

  1. I Visual Studio högerklickar du på lösningen Hantera NuGet-paket för lösning... och söker sedan efter och installerar Microsoft.Azure.Mobile.Client.SQLiteStore NuGet-paketet > för alla projekt i lösningen.

  2. I Solution Explorer öppnar du filen TodoItemManager.cs från projektet med Portable i namnet, som är Portable Class Library-projekt, och avkommenterar sedan följande förprocessordirektiv:

     #define OFFLINE_SYNC_ENABLED
    
  3. (Valfritt) För att Windows enheter installerar du något av följande SQLite-körningspaket:

  4. (Valfritt) I varje Windows-appprojekt högerklickar du på Referenser>Lägg till referens..., expanderar Windows-mappen>Tillägg. Aktivera lämplig SQLite för Windows SDK tillsammans med Visual C++ 2013 Runtime för Windows SDK. SQLite SDK-namnen varierar något med varje Windows plattform.

Granska klientsynkroniseringskoden

Här är en kort översikt över vad som redan ingår i självstudiekoden i #if OFFLINE_SYNC_ENABLED -direktivet. Offlinesynkroniseringsfunktionen finns i projektfilen TodoItemManager.cs i projektet Portable Class Library. En översikt över funktionen finns i Offline-Data Sync i Azure Mobile Apps.

  • Innan du kan utföra tabellåtgärder måste det lokala arkivet initieras. Den lokala lagringsdatabasen initieras i konstruktorn för TodoItemManager-klassen med hjälp av följande kod:

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

    Den här koden skapar en ny lokal SQLite-databas med klassen MobileServiceSQLiteStore .

    Metoden DefineTable skapar en tabell i det lokala arkivet som matchar fälten i den angivna typen. Typen behöver inte innehålla alla kolumner som finns i fjärrdatabasen. Det är möjligt att lagra en delmängd av kolumner.

  • TodoTable-fältet i TodoItemManager är en IMobileServiceSyncTable-typ i stället för IMobileServiceTable. Den här klassen använder den lokala databasen för alla CRUD-tabellåtgärder (skapa, läsa, uppdatera och ta bort). Du bestämmer när ändringarna ska skickas till mobilapps-backend genom att anropa PushAsyncpå IMobileServiceSyncContext. Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och skicka ändringar i alla tabeller som en klientapp har ändrat när PushAsync anropas.

    Följande SyncAsync-metod anropas för att synkronisera med mobilapps-backend:

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

    I det här exemplet används enkel felhantering med standardsynkroniseringshanteraren. Ett verkligt program skulle hantera olika fel som nätverksförhållanden och serverkonflikter med hjälp av en anpassad IMobileServiceSyncHandler-implementering .

Att tänka på vid offlinesynkronisering

I exemplet anropas syncAsync-metoden endast vid start och när en synkronisering begärs. Om du vill initiera en synkronisering i en Android- eller iOS-app hämtar du objektlistan. för Windows använder du knappen Synkronisera. I ett verkligt program kan du också göra synkroniseringsutlösaren när nätverkstillståndet ändras.

När en pull-åtgärd körs mot en tabell som har väntande lokala uppdateringar som spåras av kontexten utlöser den pull-åtgärden automatiskt en föregående kontext-push. När du uppdaterar, lägger till och slutför objekt i det här exemplet kan du utelämna det explicita PushAsync-anropet .

I den angivna koden efterfrågas alla poster i den fjärranslutna TodoItem-tabellen, men det är också möjligt att filtrera poster genom att skicka ett fråge-ID och fråga till PushAsync. Mer information finns i avsnittet Inkrementell synkronisering i offline Data Sync i Azure Mobile Apps.

Kör klientappen

Nu när offlinesynkronisering är aktiverat kör du klientprogrammet minst en gång på varje plattform för att fylla i den lokala lagringsdatabasen. Senare kan du simulera ett offlinescenario och ändra data i det lokala arkivet när appen är offline.

Uppdatera synkroniseringsbeteendet för klientappen

I det här avsnittet ändrar du klientprojektet för att simulera ett offlinescenario med hjälp av en ogiltig program-URL för din backend. Du kan också stänga av nätverksanslutningar genom att flytta enheten till "Flygplansläge". När du lägger till eller ändrar dataobjekt lagras ändringarna i det lokala arkivet, men synkroniseras inte till backend-datalagret förrän anslutningen har upprättats igen.

  1. I Solution Explorer du projektfilen Constants.cs från projektet PortableApplicationURL och ändrar värdet för så att det pekar på en ogiltig URL:

     public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
    
  2. Öppna filen TodoItemManager.cs från det portabla projektet och lägg sedan till en catch för den grundläggande undantagsklassen i try... catch-blocki SyncAsync. Det här catch-blocket skriver undantagsmeddelandet till konsolen enligt följande:

         catch (Exception ex)
         {
             Console.Error.WriteLine(@"Exception: {0}", ex.Message);
         }
    
  3. Skapa och kör klientappen. Lägg till några nya objekt. Observera att ett undantag loggas i konsolen för varje försök att synkronisera med backend-datorn. Dessa nya objekt finns bara i det lokala arkivet tills de kan skickas till den mobila backend-enheten. Klientappen fungerar som om den är ansluten till backend med stöd för alla CRUD-åtgärder (skapa, läsa, uppdatera, ta bort).

  4. Stäng appen och starta om den för att kontrollera att de nya objekten som du skapade är beständiga i det lokala arkivet.

  5. (Valfritt) Använd Visual Studio att visa Azure SQL Database för att se att data i serverdatabasen inte har ändrats.

    Öppna Visual Studio i Server Explorer. Gå till databasen i Azure-SQL>Databaser. Högerklicka på databasen och välj Öppna i SQL Server Object Explorer. Nu kan du bläddra till SQL databastabellen och dess innehåll.

Uppdatera klientappen för att återansluta din mobila backend

I det här avsnittet återansluter du appen till den mobila backend-enheten, vilket simulerar att appen kommer tillbaka till ett onlinetillstånd. När du utför uppdateringsgesten synkroniseras data till din mobila backend.

  1. Öppna Constants.cs igen. Korrigera så applicationURL att den pekar på rätt URL.

  2. Återskapa och kör klientappen. Appen försöker synkronisera med mobilappens backend-enhet efter start. Kontrollera att inga undantag loggas i felsökningskonsolen.

  3. (Valfritt) Visa uppdaterade data med hjälp av antingen SQL Server Object Explorer eller ett REST-verktyg som Fiddler eller Postman. Observera att data har synkroniserats mellan serverdatabasen och det lokala arkivet.

    Observera att data har synkroniserats mellan databasen och det lokala arkivet och innehåller de objekt som du lade till när appen kopplades från.

Ytterligare resurser