Udostępnij za pośrednictwem


Włączanie synchronizacji w trybie offline dla aplikacji mobilnej platformy Xamarin.Android

Przegląd

W tym samouczku przedstawiono funkcję synchronizacji offline usługi Azure Mobile Apps for Xamarin.Android. Synchronizacja w trybie offline umożliwia użytkownikom końcowym interakcję z aplikacją mobilną — wyświetlanie, dodawanie lub modyfikowanie danych — nawet jeśli nie ma połączenia sieciowego. Zmiany są przechowywane w lokalnej bazie danych. Po powrocie urządzenia do trybu online te zmiany są synchronizowane z usługą zdalną.

W tym samouczku zaktualizujesz projekt klienta z samouczka Tworzenie aplikacji platformy Xamarin dla systemu Android , aby obsługiwać funkcje trybu offline usługi Azure Mobile Apps. Jeśli nie używasz pobranego projektu serwera Szybki start, musisz dodać pakiety rozszerzeń dostępu do danych do projektu. Aby uzyskać więcej informacji na temat pakietów rozszerzeń serwera, zobacz Work with the .NET backend server SDK for Azure Mobile Apps.

Aby dowiedzieć się więcej na temat funkcji synchronizacji offline, zobacz temat Offline Data Sync w usłudze Azure Mobile Apps.

Aktualizowanie aplikacji klienckiej w celu obsługi funkcji w trybie offline

Funkcje trybu offline aplikacji mobilnej Platformy Azure umożliwiają interakcję z lokalną bazą danych w scenariuszu offline. Aby użyć tych funkcji w aplikacji, należy zainicjować SyncContext w sklepie lokalnym. Następnie odwołaj się do tabeli za pomocą interfejsu IMobileServiceSyncTable. SqLite jest używany jako magazyn lokalny na urządzeniu.

  1. W programie Visual Studio otwórz menedżera pakietów NuGet w projekcie ukończonym w samouczku Tworzenie aplikacji platformy Xamarin dla systemu Android . Wyszukaj i zainstaluj pakiet NuGet Microsoft.Azure.Mobile.Client.SQLiteStore.
  2. Otwórz plik ToDoActivity.cs i usuń komentarz z #define OFFLINE_SYNC_ENABLED definicji.
  3. W programie Visual Studio naciśnij F5, aby ponownie skompilować i uruchomić aplikację kliencka. Aplikacja działa tak samo jak przed włączeniem synchronizacji w trybie offline. Jednak lokalna baza danych jest teraz wypełniana danymi, które mogą być używane w scenariuszu offline.

Zaktualizuj aplikację, aby rozłączyć się z backendem

W tej sekcji przerywasz połączenie z zapleczem aplikacji mobilnej, aby symulować sytuację w trybie offline. Po dodaniu elementów danych program obsługi wyjątków informuje, że aplikacja jest w trybie offline. W tym stanie nowe elementy są dodawane do lokalnego magazynu i synchronizowane z zapleczem aplikacji mobilnej, gdy push jest wykonywany w stanie połączonym.

  1. Edytuj ToDoActivity.cs w udostępnionym projekcie. Zmień applicationURL, aby wskazać nieprawidłowy adres URL:

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

    Możesz również zademonstrować zachowanie w trybie offline, wyłączając sieć Wi-Fi i sieci komórkowe na urządzeniu lub korzystając z trybu samolotowego.

  2. Naciśnij F5, aby skompilować i uruchomić aplikację. Zwróć uwagę, że synchronizacja nie powiodła się podczas odświeżania po uruchomieniu aplikacji.

  3. Wprowadź nowe elementy i zwróć uwagę, że operacja wypychania kończy się niepowodzeniem z komunikatem [CancelledByNetworkError] za każdym razem, gdy klikniesz Zapisz. Jednak nowe pozycje na liście zadań istnieją w lokalnym magazynie danych do momentu, gdy mogą zostać przesłane do backendu aplikacji mobilnej. W aplikacji produkcyjnej, jeśli pomijasz te wyjątki, aplikacja kliencka zachowuje się tak, jakby nadal była połączona z zapleczem aplikacji mobilnej.

  4. Zamknij aplikację i uruchom ją ponownie, aby sprawdzić, czy nowo utworzone elementy są zapisane w pamięci lokalnej.

  5. (Opcjonalnie) W programie Visual Studio otwórz program Server Explorer. Przejdź do swojej bazy danych w Azure—>SQL Databases. Kliknij prawym przyciskiem myszy bazę danych i wybierz pozycję Otwórz w Eksploratorze obiektów programu SQL Server. Teraz możesz przejść do tabeli bazy danych SQL i jej zawartości. Sprawdź, czy dane w bazie danych zaplecza nie uległy zmianie.

  6. (Opcjonalnie) Użyj narzędzia REST, takiego jak Fiddler lub Postman, aby wykonać zapytanie względem zaplecza mobilnego przy użyciu zapytania GET w formularzu https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Aktualizowanie aplikacji w celu ponownego połączenia zaplecza aplikacji mobilnej

W tej sekcji ponownie połącz aplikację z zapleczem aplikacji mobilnej. Po pierwszym uruchomieniu aplikacji program obsługi zdarzeń OnCreate wywołuje OnRefreshItemsSelected. Ta metoda wywołuje metodę SyncAsync w celu zsynchronizowania magazynu lokalnego z bazą danych zaplecza.

  1. Otwórz ToDoActivity.cs w udostępnionym projekcie i przywróć zmianę właściwości applicationURL .

  2. Naciśnij F5, aby ponownie skompilować i uruchomić aplikację. Aplikacja synchronizuje zmiany lokalne z zapleczem usługi Azure Mobile App przy użyciu operacji wypychania i ściągania po wykonaniu metody OnRefreshItemsSelected.

  3. (Opcjonalnie) Wyświetl zaktualizowane dane przy użyciu Eksploratora obiektów programu SQL Server lub narzędzia REST, takiego jak Fiddler. Zwróć uwagę, że dane zostały zsynchronizowane między bazą danych zaplecza aplikacji mobilnej Azure a magazynem lokalnym.

  4. W aplikacji kliknij pole wyboru obok kilku elementów, aby je ukończyć w sklepie lokalnym.

    CheckItem wywołuje SyncAsync, aby zsynchronizować każdy ukończony element z zapleczem aplikacji mobilnej. SyncAsync powoduje zarówno wypychanie, jak i ściąganie. Za każdym razem, gdy wykonasz ściągnięcie względem tabeli, do której klient wprowadził zmiany, wypychanie jest zawsze wykonywane automatycznie. Dzięki temu wszystkie tabele w lokalnym magazynie oraz ich relacje pozostają zgodne i spójne. To zachowanie może spowodować nieoczekiwany efekt. Aby uzyskać więcej informacji na temat tego zachowania, zobacz Synchronizacja danych w trybie offline w usłudze Azure Mobile Apps.

Przeglądanie kodu synchronizacji klienta

Projekt klienta platformy Xamarin pobrany po ukończeniu samouczka Tworzenie aplikacji platformy Xamarin dla systemu Android zawiera już kod obsługujący synchronizację w trybie offline przy użyciu lokalnej bazy danych SQLite. Poniżej przedstawiono krótkie omówienie elementów, które zostały już uwzględnione w kodzie samouczka. Aby zapoznać się z koncepcyjnym omówieniem tej funkcji, zobacz Offline Data Sync w usłudze Azure Mobile Apps.

  • Przed rozpoczęciem wykonywania jakichkolwiek operacji na tabeli należy zainicjować lokalny magazyn. Baza danych lokalnego sklepu jest inicjowana, gdy ToDoActivity.OnCreate() uruchamia ToDoActivity.InitLocalStoreAsync(). Ta metoda tworzy lokalną bazę danych SQLite przy użyciu klasy udostępnionej MobileServiceSQLiteStore przez zestaw SDK klienta usługi Azure Mobile Apps.

    Metoda DefineTable tworzy tabelę w magazynie lokalnym, która jest zgodna z polami określonego typu, w tym przypadku ToDoItem. Typ nie musi zawierać wszystkich kolumn, które znajdują się w zdalnej bazie danych. Można przechowywać tylko podzbiór kolumn.

      // 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);
      }
    
  • Członek toDoTable z ToDoActivity jest typu IMobileServiceSyncTable zamiast IMobileServiceTable. Tabela IMobileServiceSyncTable kieruje wszystkie operacje tabel tworzenia, odczytu, aktualizacji i usuwania (CRUD) do bazy danych magazynu lokalnego.

    Decydujesz, kiedy zmiany są wypychane do zaplecza aplikacji mobilnej Platformy Azure, wywołując polecenie IMobileServiceSyncContext.PushAsync(). Kontekst synchronizacyjny pomaga zachować relacje między tabelami poprzez śledzenie i przesyłanie zmian we wszystkich tabelach, które aplikacja kliencka zmodyfikowała po wywołaniu PushAsync.

    Podany kod wywołuje ToDoActivity.SyncAsync() w celu synchronizacji za każdym razem, gdy lista elementów zadań zostanie odświeżona lub gdy zostanie dodany lub ukończony nowy element zadania. Kod jest synchronizowany po każdej zmianie lokalnej.

    W podanym kodzie są odpytywane wszystkie rekordy w zdalnej tabeli TodoItem, ale istnieje również możliwość filtrowania rekordów poprzez przekazanie identyfikatora zapytania i zapytania do PushAsync. Aby uzyskać więcej informacji, zobacz sekcję Synchronizacji przyrostowej w sekcji Synchronizacja danych w trybie offline w usłudze 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");
          }
      }
    

Dodatkowe zasoby