Synchronizacja danych offline

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 udostępniają IRemoteTable<T>element , który 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 IOfflineTable<T>program ) 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, dopóki nie wypchniesz zmian lokalnych. Podobnie magazyn lokalny jest wypełniany nowymi lub zaktualizowanymi danymi tylko podczas ściągania danych.

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żna skonfigurować wypychanie wszystkich tabel, ustawiając wartość w pliku PushOtherTablesPullOptions:

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 UpdatedAt pole ostatniego pomyślnie przeniesionego rekordu jest przechowywane jako token w magazynie offline. Ostatnia UpdatedAt wartość 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. WriteDeltaTokenInterval Wartość większa niż 25 nie znacznie poprawia wydajności.

Przeczyszczanie

Zawartość magazynu lokalnego można wyczyścić przy użyciu polecenia 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 InvalidOperationException błąd, 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.