Aktivera offlinesynkronisering för din Xamarin.Android-mobilapp

Översikt

I den här självstudien introduceras offlinesynkroniseringsfunktionen i Azure Mobile Apps för Xamarin.Android. 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.

I den här självstudien uppdaterar du klientprojektet från självstudien Skapa en Xamarin Android-app för att stödja offlinefunktionerna i Azure Mobile Apps. Om du inte använder det nedladdade snabbstartsserverprojektet 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.

Uppdatera klientappen så att den stöder offlinefunktioner

Med offlinefunktionerna i Azure Mobile App kan du interagera med en lokal databas när du befinner dig i ett offlinescenario. Om du vill använda dessa funktioner i din app initierar du en SyncContext till en lokal butik. Referera sedan till tabellen via gränssnittet IMobileServiceSyncTable . SQLite används som lokalt lager på enheten.

  1. I Visual Studio du nuget-pakethanteraren i projektet som du slutförde i självstudien Skapa en Xamarin Android-app. Sök efter och installera NuGet-paketet Microsoft.Azure.Mobile.Client.SQLiteStore .
  2. Öppna filen ToDoActivity.cs och avkommentera #define OFFLINE_SYNC_ENABLED definitionen.
  3. I Visual Studio trycker du på F5 för att återskapa och köra klientappen. Appen fungerar på samma sätt som innan du aktiverade offlinesynkronisering. Den lokala databasen fylls dock nu med data som kan användas i ett offlinescenario.

Uppdatera appen för att koppla från backend

I det här avsnittet bryter du anslutningen till mobilapps-backend för att simulera en offline-situation. När du lägger till dataobjekt anger undantagshanteraren att appen är i offlineläge. I det här tillståndet läggs nya objekt till i det lokala arkivet och synkroniseras till mobilappens backend-enhet när en push körs i ett anslutet tillstånd.

  1. Redigera ToDoActivity.cs i det delade projektet. Ändra applicationURL så att den pekar på en ogiltig URL:

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

    Du kan också demonstrera offlinebeteendet genom att inaktivera Wi-Fi och mobilnät på enheten eller använda flygplansläge.

  2. Tryck på F5 för att skapa och köra appen. Observera att synkroniseringen misslyckades vid uppdatering när appen startades.

  3. Ange nya objekt och lägg märke till att push-meddelandet misslyckas med statusen [CancelledByNetworkError] varje gång du klickar på Spara. De nya att göra-objekten finns dock i det lokala arkivet tills de kan skickas till mobilappens backend-enhet. Om du ignorerar de här undantagen i en produktionsapp beter sig klientappen som om den fortfarande är ansluten till mobilappens backend.

  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) Ö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. Kontrollera att data i serverdatabasen inte har ändrats.

  6. (Valfritt) Använd ett REST-verktyg som Fiddler eller Postman för att fråga din mobila backend med hjälp av en GET-fråga i formuläret https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Uppdatera appen för att återansluta mobilapps-backend

I det här avsnittet återansluter du appen till mobilappens backend. Första gången du kör programmet anropar OnCreate händelsehanteraren OnRefreshItemsSelected. Den här metoden anropar SyncAsync för att synkronisera ditt lokala arkiv med serverdatabasen.

  1. Öppna ToDoActivity.cs i det delade projektet och återställ ändringen av egenskapen applicationURL .

  2. Tryck på F5 för att återskapa och köra appen. Appen synkroniserar dina lokala ändringar med Azure Mobile App-backend med push- och pull-åtgärder när OnRefreshItemsSelected metoden körs.

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

  4. I appen klickar du på kryssrutan bredvid några objekt för att slutföra dem i det lokala arkivet.

    CheckItem anropar SyncAsync för att synkronisera varje slutfört objekt med mobilapps-backend. SyncAsync anropar både push och pull. När du kör en pull-körning mot en tabell som klienten har gjort ändringar i körs alltid en push automatiskt. Detta säkerställer att alla tabeller i det lokala arkivet tillsammans med relationer förblir konsekventa. Det här beteendet kan resultera i en oväntad push-push. Mer information om det här beteendet finns i Offline-Data Sync i Azure Mobile Apps.

Granska klientsynkroniseringskoden

Xamarin-klientprojektet som du laddade ned när du slutförde självstudien Skapa en Xamarin Android-app innehåller redan kod som stöder offlinesynkronisering med hjälp av en lokal SQLite-databas. Här är en kort översikt över vad som redan ingår i självstudiekoden. 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 när ToDoActivity.OnCreate() kör ToDoActivity.InitLocalStoreAsync(). Den här metoden skapar en lokal SQLite-databas med hjälp av MobileServiceSQLiteStore klassen som tillhandahålls av Azure Mobile Apps klient-SDK.

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

      // 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);
      }
    
  • Medlemmen toDoTable i är ToDoActivity av typen IMobileServiceSyncTable i stället för IMobileServiceTable. IMobileServiceSyncTable dirigerar alla crud-tabellåtgärder (skapa, läsa, uppdatera och ta bort) till den lokala lagringsdatabasen.

    Du bestämmer när ändringar ska skickas till Azure Mobile App-backend genom att anropa IMobileServiceSyncContext.PushAsync(). Synkroniseringskontexten hjälper till att bevara tabellrelationer genom att spåra och push-pusha ändringar i alla tabeller som en klientapp har ändrat när PushAsync anropas.

    Den angivna koden anropar ToDoActivity.SyncAsync() för att synkronisera när todoitem-listan uppdateras eller en todoitem läggs till eller slutförs. Koden synkroniseras efter varje lokal ändring.

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

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

Ytterligare resurser