Synchronizacja danych w trybie offline
Nuta
Ten produkt jest wycofany. Aby zastąpić projekty przy użyciu platformy .NET 8 lub nowszej, zobacz bibliotekę datasync zestawu narzędzi Community Toolkit.
Synchronizacja danych w trybie offline to funkcja zestawu SDK usługi Azure Mobile Apps. Dane są przechowywane w magazynie lokalnym. Gdy aplikacja jest w trybie offline, nadal możesz tworzyć, modyfikować i przeszukiwać dane. Dane są synchronizowane z usługą Azure Mobile Apps, gdy urządzenie jest w trybie online. Zestaw SDK obsługuje rozwiązywanie konfliktów, gdy ten sam rekord jest zmieniany zarówno na kliencie, jak i w usłudze.
Synchronizacja w trybie offline ma kilka korzyści:
- Poprawia czas odpowiedzi aplikacji
- Zwiększa niezawodność aplikacji w przypadku nieprawidłowej łączności sieciowej
- Ogranicza użycie sieci w sieciach o dużym opóźnieniu lub mierzonych
- Obsługuje odłączone użycie
W poniższych samouczkach pokazano, jak dodać synchronizację w trybie offline do klientów mobilnych przy użyciu usługi Azure Mobile Apps:
- Avalonia: włączanie synchronizacji w trybie offline
- .NET MAUI: włączanie synchronizacji w trybie offline
- Cofanie platformy: włączanie synchronizacji w trybie offline
- Windows (UWP): włączanie synchronizacji w trybie offline
- Windows (WinUI3): włączanie synchronizacji w trybie offline
- Windows (WPF): włączanie synchronizacji w trybie offline
- Xamarin.Android: włączanie synchronizacji w trybie offline
- zestawu narzędzi Xamarin.Forms: włączanie synchronizacji w trybie offline
- Xamarin.iOS: włączanie synchronizacji w trybie offline
Co to jest tabela synchronizacji?
Zestawy SDK usługi Azure Mobile Apps zapewniają IRemoteTable<T>
, która uzyskuje bezpośredni dostęp do usługi. Operacja kończy się niepowodzeniem, jeśli urządzenie nie ma połączenia sieciowego. Tabela synchronizacji
Co to jest magazyn lokalny?
Magazyn lokalny to warstwa trwałości danych na urządzeniu klienckim. Większość platform używa sqlite dla magazynu lokalnego, ale system iOS używa danych podstawowych. Możesz również zaimplementować własny sklep lokalny. Na przykład użyj wersji SQLite z funkcją SQLCipher, aby utworzyć zaszyfrowany magazyn.
Jak działa synchronizacja w trybie offline?
Kod klienta określa, kiedy zmiany lokalne są synchronizowane z usługą synchronizacji danych. Nic nie jest wysyłane do usługi do momentu wypchnięcia lokalnych zmian. Podobnie magazyn lokalny jest wypełniany nowymi lub zaktualizowanymi danymi tylko wtedy, gdy ściągać dane.
Możesz wypchnąć oczekujące operacje dla wszystkich tabel, listy tabel lub jednej tabeli:
// All tables
await client.PushTablesAsync();
// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);
// A single table
await table.PushItemsAsync();
Synchronizacja
Operacja wypychania wysyła wszystkie oczekujące zmiany w kolejce operacji do usługi. Oczekująca zmiana jest wysyłana do usługi za pośrednictwem wywołania REST PROTOKOŁU HTTP, co z kolei modyfikuje bazę danych.
Operacje wypychania są wykonywane przed wszelkimi operacjami ściągania. Operacja ściągania pobiera zmienione dane z usługi i przechowuje je w magazynie lokalnym.
Wypychanie niejawne
Jeśli wykonasz ściągnięcie względem tabeli z oczekującymi aktualizacjami lokalnymi, ściąganie najpierw wykonuje wypychanie dla tej tabeli. To wypychanie pomaga zminimalizować konflikty między zmianami, które są już kolejkowane i nowe dane z serwera. Opcjonalnie możesz skonfigurować wypychanie wszystkich tabel, ustawiając PushOtherTables
w PullOptions
:
var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);
Ściąganie podzbioru rekordów
Opcjonalnie możesz określić zapytanie używane do określenia, które rekordy powinny być uwzględnione w bazie danych trybu offline. Na przykład:
var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);
Synchronizacja przyrostowa
Usługa Azure Mobile Apps implementuje synchronizację przyrostową. Ściągane są tylko rekordy, które uległy zmianie od ostatniej operacji ściągania. Synchronizacja przyrostowa pozwala zaoszczędzić czas i przepustowość podczas przetwarzania dużych tabel.
Dla każdego unikatowego zapytania pole UpdatedAt
ostatniego pomyślnie przeniesionego rekordu jest przechowywane jako token w magazynie offline. Ostatnia wartość UpdatedAt
jest przechowywana w magazynie tokenów różnicowych. Magazyn tokenów różnicowych jest implementowany jako tabela w magazynie offline.
Wydajność i spójność
Synchronizacja czasami zatrzymuje się przedwcześnie. Na przykład:
- Sieć używana do synchronizacji staje się niedostępna podczas procesu synchronizacji.
- Wymusisz zamknięcie aplikacji podczas synchronizacji.
Aby zminimalizować ryzyko problemu ze spójnością w bazie danych w trybie offline, każdy rekord jest zapisywany w bazie danych w miarę odbierania. Opcjonalnie możesz zdecydować się na zapisanie rekordów w bazie danych w partiach. Operacje wsadowe zwiększają wydajność zapisów bazy danych w trybie offline podczas operacji ściągania. Zwiększają one jednak również ryzyko niespójności między metadanymi tabeli a danymi w tabeli.
Interwał między zapisami można dostosować w następujący sposób:
var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);
Ten kod zbiera zapisy w partiach 25 rekordów. Testowanie wydajności sugeruje, że wydajność zwiększa się do wartości 25. Wartość WriteDeltaTokenInterval
większa niż 25 nie znacznie poprawia wydajności.
Przeczyszczanie
Zawartość magazynu lokalnego można wyczyścić przy użyciu IOfflineTable<T>.PurgeItemsAsync
. Przeczyszczanie może być konieczne, jeśli masz nieaktualne dane w bazie danych klienta lub jeśli chcesz odrzucić wszystkie oczekujące zmiany. Przeczyszczenie czyści tabelę ze sklepu lokalnego. Aby przeczyścić tabelę:
await table.PurgeItemsAsync("", new PurgeOptions());
Metoda PurgeItemsAsync()
zgłasza błąd InvalidOperationException
, jeśli w tabeli występują oczekujące zmiany. W takim przypadku można wymusić przeczyszczanie:
await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });
Przeczyszczanie to ostatnia metoda czyszczenia tabeli w magazynie offline, ponieważ czyści wszystkie rekordy z pamięci podręcznej i wymaga ich ponownego pobrania.