Udostępnij za pośrednictwem


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:

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 (dostarczana przez ) udostępnia te same operacje w magazynie lokalnym. Magazyn lokalny można następnie zsynchronizować z usługą w późniejszym czasie. Przed wykonaniem jakichkolwiek operacji należy zainicjować magazyn lokalny.

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.