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

Omówienie

W tym samouczku wprowadzono funkcję synchronizacji w trybie offline platformy Azure Mobile Apps platformie Xamarin.Android. Synchronizacja w trybie offline umożliwia użytkownikom mobilnym interakcję z aplikacją mobilną — wyświetlanie, dodawanie lub modyfikowanie danych — nawet wtedy, gdy 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 zaktualizujemy projekt klienta z samouczka Create a Xamarin Android app to support the offline features of Azure Mobile Apps (Tworzenie aplikacji platformy Xamarin dla systemu Android w celu obsługi funkcji offline usługi Azure Mobile Apps). Jeśli nie używasz pobranego projektu serwera Szybki start, musisz dodać do projektu pakiety rozszerzeń dostępu do danych. Aby uzyskać więcej informacji na temat pakietów rozszerzeń serwera, zobacz Praca z zestawem SDK serwera zaplecza platformy .NET dla usługi Azure Mobile Apps.

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

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

Funkcje aplikacji mobilnej platformy Azure w trybie offline umożliwiają interakcję z lokalną bazą danych w scenariuszu offline. Aby korzystać z tych funkcji w aplikacji, należy zainicjować bibliotekę SyncContext w magazynie lokalnym. Następnie przywołuj tabelę za pomocą interfejsu IMobileServiceSyncTable . SqLite jest używany jako magazyn lokalny na urządzeniu.

  1. W Visual Studio otwórz menedżera pakietów NuGet w projekcie, który został ukończony 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 odłącz definicję #define OFFLINE_SYNC_ENABLED .
  3. W Visual Studio naciśnij klawisz F5, aby ponownie skompilować i uruchomić aplikację kliencową. Aplikacja działa tak samo jak przed rozpoczęciem synchronizacji w trybie offline. Jednak lokalna baza danych jest teraz wypełniona danymi, których można używać w scenariuszu offline.

Aktualizowanie aplikacji w celu rozłączenia z zaplecza

W tej sekcji przerwiesz połączenie z zaplecza 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 dodane w magazynie lokalnym są synchronizowane z zaplecza aplikacji mobilnej, gdy wypychanie jest wykonywane w stanie połączenia.

  1. Edytuj toDoActivity.cs w udostępnionym projekcie. Zmień adres 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 sieci Wi-Fi i komórkowe na urządzeniu lub używając trybu samolotowego.

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

  3. Wprowadź nowe elementy i zwróć uwagę, że wypychanie kończy się niepowodzeniem ze stanem [CancelledByNetworkError] po każdym kliknięciu przycisku Zapisz. Jednak nowe elementy todo istnieją w magazynie lokalnym, dopóki nie będzie można ich wypchnąć do zaplecza aplikacji mobilnej. Jeśli pominiesz te wyjątki w aplikacji produkcyjnej, aplikacja kliency zachowuje się tak, jakby nadal była połączona z zaplecza aplikacji mobilnej.

  4. Zamknij aplikację i uruchom ją ponownie, aby sprawdzić, czy nowo utworzone elementy są utrwalane w magazynie lokalnym.

  5. (Opcjonalnie) W Visual Studio otwórz Eksplorator serwera. Przejdź do bazy danych w usłudze Azure-SQL>Databases. Kliknij prawym przyciskiem myszy bazę danych i wybierz polecenie Otwórz w SQL Server Eksplorator obiektów. Teraz możesz przejść do tabeli SQL bazy danych 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 wysłać zapytanie do zaplecza mobilnego przy użyciu zapytania GET w postaci https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

Aktualizowanie aplikacji w celu ponownego nawiązania połączenia z zaplecza aplikacji mobilnej

W tej sekcji ponownie połączysz aplikację z zapleczami aplikacji mobilnej. Przy pierwszym uruchomieniu aplikacji program obsługi OnCreate zdarzeń 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 klawisz F5 , aby ponownie skompilować i uruchomić aplikację. Aplikacja synchronizuje lokalne zmiany z zaplecza aplikacji mobilnej platformy Azure przy użyciu operacji wypychania i ściągania podczas OnRefreshItemsSelected wykonywania metody.

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

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

    CheckItem wywołuje SyncAsync usługę w celu zsynchronizowania każdego ukończonego elementu z zaplecza aplikacji mobilnej. SyncAsync Wywołuje zarówno wypychanie, jak i ściąganie. Zawsze, gdy wykonujesz ściągnięcie względem tabeli, w których klient wprowadza zmiany, wypychanie jest zawsze wykonywane automatycznie. Dzięki temu wszystkie tabele w magazynie lokalnym wraz z relacjami pozostają spójne. To zachowanie może spowodować nieoczekiwane wypychanie. Aby uzyskać więcej informacji na temat tego zachowania, zobacz Offline Data Sync in Azure Mobile Apps (Tryb offline w usłudze Azure Mobile Apps).

Przeglądanie kodu synchronizacji klienta

Projekt klienta platformy Xamarin pobrany po ukończeniu samouczka Tworzenie aplikacji 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 tego, co zostało już uwzględnione w kodzie samouczka. Aby uzyskać koncepcyjne omówienie tej funkcji, zobacz Offline Data Sync in Azure Mobile Apps (Omówienie offline w usłudze Azure Mobile Apps).

  • Przed rozpoczęciem jakichkolwiek operacji na tabelach należy zainicjować magazyn lokalny. Baza danych magazynu lokalnego jest inicjowana podczas ToDoActivity.OnCreate() wykonywania polecenia ToDoActivity.InitLocalStoreAsync(). Ta metoda tworzy lokalną bazę danych SQLite przy użyciu MobileServiceSQLiteStore klasy dostarczonej przez zestaw SDK Mobile Apps Azure.

    Metoda DefineTable tworzy w magazynie lokalnym tabelę, która ToDoItem w tym przypadku pasuje do pól w podanego typu. Typ nie musi zawierać wszystkich kolumn, które znajdują się w zdalnej bazie danych. Istnieje możliwość przechowywania tylko podzestawu 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łonkiem toDoTable jest ToDoActivity typ , IMobileServiceSyncTable a nie IMobileServiceTable. Tabela IMobileServiceSyncTable kieruje wszystkie operacje tworzenia, odczytu, aktualizacji i usuwania tabeli (CRUD) do lokalnej bazy danych magazynu.

    Decydujesz o tym, kiedy zmiany są wypychane do zaplecza aplikacji mobilnej platformy Azure, wywołując usługę IMobileServiceSyncContext.PushAsync(). Kontekst synchronizacji pomaga zachować relacje tabeli, śledząc i wypychając zmiany we wszystkich tabelach, które aplikacja klienca zmodyfikował po wywołaniu PushAsync .

    Podany kod wywołuje synchronizację ToDoActivity.SyncAsync() za każdym razem, gdy lista zadań do zadania zostanie odświeżona lub zostanie dodane lub zakończone todoitem. Kod jest synchronizowane po każdej zmianie lokalnej.

    W podanym kodzie wszystkie TodoItem rekordy w tabeli zdalnej są odpytywalne, ale istnieje również możliwość filtrowania rekordów przez przekazanie identyfikatora zapytania i zapytania do .PushAsync Aby uzyskać więcej informacji, zobacz sekcję Incremental Sync in Offline Data Sync in Azure Mobile Apps (Synchronizacja przyrostowa 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