Włączanie synchronizacji w trybie offline dla aplikacji mobilnej platformy Xamarin.Forms
Omówienie
W tym samouczku wprowadzono funkcję synchronizacji w trybie offline usługi Azure Mobile Apps dla platformy Xamarin.Forms. 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ą.
Ten samouczek jest oparty na rozwiązaniu Szybki start platformy Xamarin.Forms dla platformy Mobile Apps, które utworzysz po ukończeniu samouczka [Tworzenie aplikacji platformy Xamarin dla systemu iOS]. Rozwiązanie Szybkiego startu dla zestawu narzędzi Xamarin.Forms zawiera kod obsługujący synchronizację w trybie offline, który wystarczy włączyć. W tym samouczku zaktualizujemy rozwiązanie Szybki start, aby włączyć funkcje offline usługi Azure Mobile Apps. Wyróżniamy również kod specyficzny dla trybu offline w aplikacji. Jeśli nie używasz pobranego rozwiązania Szybki start, musisz dodać pakiety rozszerzenia dostępu do danych do projektu. 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 (Synchronizacja w trybie offline w usłudze Azure Mobile Apps).
Włączanie funkcji synchronizacji w trybie offline w rozwiązaniu Szybki start
Kod synchronizacji w trybie offline jest uwzględniany w projekcie przy użyciu dyrektyw preprocesora języka C#. Po OFFLINE_SYNC_ENABLED zdefiniowanego symbolu kodu te ścieżki kodu są uwzględniane w kompilacji. W Windows aplikacji należy również zainstalować platformę SQLite.
W Visual Studio kliknij > prawym przyciskiem myszy rozwiązanie Zarządzaj pakietami NuGet dla rozwiązania..., a następnie wyszukaj i zainstaluj pakiet microsoft.Azure.Mobile.Client.SQLiteStore NuGet dla wszystkich projektów w rozwiązaniu.
W pliku Eksplorator rozwiązań otwórz plik TodoItemManager.cs z projektu z wartością Portable w nazwie, czyli projektem Portable Class Library, a następnie odkomentuj następującą dyrektywę preprocesora:
#define OFFLINE_SYNC_ENABLED
(Opcjonalnie) Aby obsługiwać Windows, zainstaluj jeden z następujących pakietów środowiska uruchomieniowego SQLite:
Windows 8.1 Runtime: zainstaluj program SQLite dla Windows 8.1.
Windows Phone 8.1: zainstaluj program SQLite dla Windows Phone 8.1.
platforma uniwersalna systemu Windows zainstaluj program SQLite dla aplikacji universal Windows Universal.
Mimo że przewodnik Szybki start nie zawiera projektu Universal Windows, platforma Universal Windows jest obsługiwana za pomocą platformy Xamarin Forms.
(Opcjonalnie) W każdym Windows aplikacji kliknij prawym przyciskiem myszy pozycję OdwołaniaDeksuj> odwołanie..., rozwiń Windows rozszerzenia >folderu. Włącz odpowiedni interfejs SQLite dla Windows SDK wraz ze środowiskiem uruchomieniowym Visual C++ 2013 dla Windows SDK. Nazwy zestawu SQLite SDK różnią się nieco w zależności Windows platformie.
Przeglądanie kodu synchronizacji klienta
Poniżej przedstawiono krótkie omówienie tego, co jest już zawarte w kodzie samouczka wewnątrz dyrektyw #if OFFLINE_SYNC_ENABLED
. Funkcja synchronizacji w trybie offline znajduje się w pliku projektu TodoItemManager.cs w projekcie biblioteki klas przenośnych. Aby uzyskać koncepcyjne omówienie tej funkcji, zobacz Offline Data Sync in Azure Mobile Apps (Omówienie trybu offline w usłudze Azure Mobile Apps).
Przed rozpoczęciem jakichkolwiek operacji na tabelach należy zainicjować magazyn lokalny. Lokalna baza danych magazynu jest zainicjowana w konstruktorze klasy TodoItemManager przy użyciu następującego kodu:
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>();
Ten kod tworzy nową lokalną bazę danych SQLite przy użyciu klasy MobileServiceSQLiteStore .
Metoda DefineTable tworzy tabelę w magazynie lokalnym, która pasuje do pól w dostarczonym typie. Typ nie musi zawierać wszystkich kolumn, które znajdują się w zdalnej bazie danych. Istnieje możliwość przechowywania podzestawu kolumn.
Pole todoTable w todoItemManager jest typem IMobileServiceSyncTable zamiast IMobileServiceTable. Ta klasa używa lokalnej bazy danych do wszystkich operacji tworzenia, odczytywania, aktualizowania i usuwania tabel (CRUD). Decydujesz, kiedy te zmiany są wypychane do zaplecza aplikacji mobilnej, wywołując pushAsync w formacie IMobileServiceSyncContext. Kontekst synchronizacji pomaga zachować relacje tabeli, śledząc i wypychając zmiany we wszystkich tabelach, które aplikacja klienca zmodyfikuje po wywołaniu pushAsync .
Następująca metoda SyncAsync jest wywoływana w celu synchronizacji z zaplecza aplikacji mobilnej:
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"]); } } }
W tym przykładzie użyto prostej obsługi błędów z domyślną obsługą synchronizacji. Rzeczywista aplikacja będzie obsługiwać różne błędy, takie jak warunki sieciowe i konflikty serwera, przy użyciu niestandardowej implementacji IMobileServiceSyncHandler .
Zagadnienia dotyczące synchronizacji w trybie offline
W przykładzie metoda SyncAsync jest wywoływana tylko podczas uruchamiania i gdy jest żądana synchronizacja. Aby zainicjować synchronizację w aplikacji systemu Android lub iOS, ściągnij listę elementów. Aby Windows, użyj przycisku Synchronizuj. W rzeczywistych aplikacjach można również wykonać wyzwalacz synchronizacji po zmianie stanu sieci.
Gdy ściąganie jest wykonywane względem tabeli, która ma oczekujące aktualizacje lokalne śledzone przez kontekst, ta operacja ściągania automatycznie wyzwala poprzednie wypchnięcie kontekstu. Podczas odświeżania, dodawania i kończenie elementów w tym przykładzie można pominąć jawne wywołanie PushAsync .
W podanym kodzie wszystkie rekordy w zdalnej tabeli TodoItem 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ę Synchronizacja przyrostowa w trybie offline Data Sync usłudze Azure Mobile Apps.
Uruchamianie aplikacji klienckiej
Po włączeniu synchronizacji w trybie offline uruchom aplikację klienską co najmniej raz na każdej platformie, aby wypełnić bazę danych magazynu lokalnego. Później zasymuluj scenariusz w trybie offline i zmodyfikuj dane w magazynie lokalnym, gdy aplikacja jest w trybie offline.
Aktualizowanie zachowania synchronizacji aplikacji klienckiej
W tej sekcji zmodyfikuj projekt klienta, aby symulować scenariusz w trybie offline przy użyciu nieprawidłowego adresu URL aplikacji dla zaplecza. Możesz też wyłączyć połączenia sieciowe, przenosząc urządzenie do trybu samolotowego. Podczas dodawania lub zmieniania elementów danych te zmiany są przechowywane w magazynie lokalnym, ale nie są synchronizowane z magazynem danych zaplecza do momentu ponownego nawiązaniu połączenia.
W Eksplorator rozwiązań projektu Constants.cs z projektu Portable
ApplicationURL
i zmień wartość , aby wskazać nieprawidłowy adres URL:public static string ApplicationURL = @"https://your-service.azurewebsites.net/";
Otwórz plik TodoItemManager.cs z projektu Portable , a następnie dodaj klasę catch dla podstawowej klasy Exception do pliku try... blok catch w programie SyncAsync. Ten blok catch zapisuje komunikat o wyjątku w konsoli w następujący sposób:
catch (Exception ex) { Console.Error.WriteLine(@"Exception: {0}", ex.Message); }
Skompilowanie i uruchomienie aplikacji klienckiej. Dodaj nowe elementy. Zwróć uwagę, że w konsoli jest rejestrowany wyjątek dla każdej próby synchronizacji z zaplecza. Te nowe elementy istnieją tylko w magazynie lokalnym, dopóki nie będzie można ich wypchnąć do zaplecza mobilnego. Aplikacja kliency zachowuje się tak, jakby była połączona z zapleczami, obsługując wszystkie operacje tworzenia, odczytu, aktualizacji i usuwania (CRUD).
Zamknij aplikację i uruchom ją ponownie, aby sprawdzić, czy nowo utworzone elementy są utrwalane w magazynie lokalnym.
(Opcjonalnie) Użyj Visual Studio, aby wyświetlić tabelę Azure SQL Database, aby zobaczyć, że dane w bazie danych zaplecza nie uległy zmianie.
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 swojej SQL bazy danych i jej zawartości.
Aktualizowanie aplikacji klienckiej w celu ponownego nawiązania połączenia z zapleczami mobilnymi
W tej sekcji ponownie połączysz aplikację z zapleczami mobilnymi, które symulują powrót aplikacji do stanu online. Podczas wykonywania gestu odświeżania dane są synchronizowane z zapleczami mobilnymi.
Otwórz ponownie constants.cs. Popraw adres ,
applicationURL
aby wskazać prawidłowy adres URL.Ponownie skompilować i uruchomić aplikację kliencyjną. Aplikacja próbuje zsynchronizować się z zapleczami aplikacji mobilnej po uruchomieniu. Sprawdź, czy w konsoli debugowania nie są rejestrowane żadne wyjątki.
(Opcjonalnie) Wyświetl zaktualizowane dane przy użyciu narzędzia SQL Server Eksplorator obiektów REST, takiego jak Fiddler lub Postman. Zwróć uwagę, że dane zostały zsynchronizowane między bazą danych zaplecza a magazynem lokalnym.
Zwróć uwagę, że dane zostały zsynchronizowane między bazą danych a magazynem lokalnym i zawierają elementy dodane podczas odłączenia aplikacji.