Synchronizuj dane

Większość aplikacji integrujących się z Health Connect ma własny magazyn danych, który pełni rolę źródła informacji. Health Connect umożliwia zsynchronizowanie aplikacji.

Upewnij się, że aplikacja:

  • Przesyła nowe lub zaktualizowane dane z magazynu danych Twojej aplikacji do aplikacji Health Connect.
  • Pobiera dane o zmianach z Health Connect, które są odzwierciedlane w magazynie danych aplikacji.
  • Usuwa dane z Health Connect po ich usunięciu z magazynu danych aplikacji.

W każdym przypadku dopilnuj, aby proces synchronizacji był zgodny z Health Connect i magazynem danych aplikacji.

Prześlij dane do Health Connect

Pierwsza część procesu synchronizacji to przesłanie informacji z magazynu danych Twojej aplikacji do magazynu danych Health Connect.

Przygotowywanie danych

Zwykle rekordy w magazynie danych aplikacji zawierają te szczegółowe informacje:

  • Klucz unikalny, np. UUID.
  • Wersja lub sygnatura czasowa.

Zaprojektuj magazyn danych swojej aplikacji tak, aby śledzić, jakie dane zostały już przesłane do Health Connect. Aby to osiągnąć, zastosuj tę logikę:

  • Podaj listę zmian i token, którego można użyć do pobrania rekordów z aktualizacjami od czasu wystawienia ostatniego tokena.
  • Śledzenie ostatniej modyfikacji wyeksportowanych danych.

Te czynności są niezbędne, aby mieć pewność, że do Health Connect przekazywane są tylko nowe lub zaktualizowane dane.

Zapisywanie danych w Health Connect

Aby przesłać dane do Health Connect, wykonaj te czynności:

  1. Uzyskaj listę nowych lub zaktualizowanych wpisów z magazynu danych Twojej aplikacji.
  2. Dla każdego wpisu utwórz obiekt Record odpowiedni do danego typu danych. Możesz na przykład utworzyć obiekt WeightRecord dla danych związanych z wagą.
  3. Określ obiekt Metadata z każdym elementem Record, korzystając z unikalnego klucza i szczegółów wersji z magazynu danych aplikacji. Jeśli dane nie mają wersji, możesz zamiast niej użyć wartości Long bieżącej sygnatury czasowej.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Prześlij dane do Health Connect przez Upsert za pomocą insertRecords. Upsertowanie danych oznacza, że wszelkie dotychczasowe dane w Health Connect są zastępowane, o ile w magazynie danych Health Connect znajdują się wartości clientRecordId, a wartość clientRecordVersion jest wyższa niż obecna wartość. W przeciwnym razie dane wstawione przez upsert są zapisywane jako nowe dane.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Aby dowiedzieć się więcej o praktycznych kwestiach związanych z przesyłaniem danych, zapoznaj się ze sprawdzonymi metodami dotyczącymi zapisywania danych.

Przechowuj identyfikatory Health Connect

Po dodaniu swoich rekordów do Health Connect w magazynie danych aplikacji musisz zapisać id dla każdego rekordu. Dzięki temu aplikacja może sprawdzić, czy każda zmiana przychodząca wymaga utworzenia nowego lub zaktualizowania istniejącego rekordu po pobraniu danych.

Funkcja insertRecords zwraca InsertRecordsResponse z listą wartości id. Użyj odpowiedzi, aby uzyskać identyfikatory rekordów i je zapisać.

val response = healthConnectClient.insertRecords(arrayListOf(record))

for (recordId in response.recordIdsList) {
    // Store recordId to your app's datastore
}

Pobieraj dane z Health Connect

Druga część procesu synchronizacji polega na pobieraniu wszelkich zmian danych z Health Connect do magazynu danych Twojej aplikacji. Zmiany danych mogą obejmować aktualizację lub usunięcie danych.

Pobieranie tokena zmian

Aby uzyskać listę zmian do pobrania z Health Connect, aplikacja musi śledzić tokeny zmian. Możesz ich użyć, gdy poprosisz o zwrócenie listy zmian danych w sekcji Zmiany i nowy token Zmiany, który zostanie użyty następnym razem.

Aby uzyskać token Changes, wywołaj getChangesToken i podaj wymagane typy danych.

val changesToken = healthConnectClient.getChangesToken(
    ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)

Sprawdź, czy dane nie uległy zmianie

Gdy otrzymasz token Zmiany, użyj go, aby pobrać wszystkie Zmiany. Zalecamy utworzenie pętli, aby umożliwić przeglądanie wszystkich zmian w celu sprawdzenia, czy są dostępne zmiany w danych. W tym celu:

  1. Wywołaj metodę getChanges przy użyciu tokena, aby uzyskać listę zmian.
  2. Sprawdź każdą zmianę, niezależnie od tego, czy jest to UpsertionChange, czy DeletionChange, i wykonaj niezbędne operacje.
    • Aby mieć pewność, że nie importujesz ponownie danych, w przypadku aplikacji UpsertionChange wprowadź tylko zmiany, które nie pochodzą z aplikacji do połączeń.
  3. Jako nowy token przypisz kolejny token Changes (zmiany).
  4. Powtarzaj kroki 1–3, aż nie zostaną już żadne Zmian.
  5. Przechowuj następny token i zarezerwuj go na potrzeby przyszłego importu.
suspend fun processChanges(token: String): String {
    var nextChangesToken = token
    do {
        val response = healthConnectClient.getChanges(nextChangesToken)
        response.changes.forEach { change ->
            when (change) {
                is UpsertionChange ->
                    if (change.record.metadata.dataOrigin.packageName != context.packageName) {
                        processUpsertionChange(change)
                    }
                is DeletionChange -> processDeletionChange(change)
            }
        }
        nextChangesToken = response.nextChangesToken
    } while (response.hasMore)
    // Return and store the changes token for use next time.
    return nextChangesToken
}

Aby dowiedzieć się więcej o praktycznych kwestiach związanych z pobieraniem danych, zapoznaj się ze sprawdzonymi metodami synchronizowania danych.

Przetwarzanie zmian danych

Odzwierciedla zmiany w magazynie danych aplikacji. W przypadku UpsertionChange użyj id i lastModifiedTime z metadata do uruchomienia rekordu. W przypadku DeletionChange użyj podanej wartości id, aby usunąć rekord.

Usuwanie danych z Health Connect

Gdy użytkownik usunie swoje dane z Twojej aplikacji, upewnij się, że zostały one też usunięte z Health Connect. Do tego celu użyj narzędzia deleteRecords. Pobiera to typ rekordu i listę wartości id oraz clientRecordId, co ułatwia grupowanie wielu danych do usunięcia. Dostępny jest też alternatywny deleteRecords, który obsługuje timeRangeFilter.

Sprawdzone metody synchronizacji danych

Na proces synchronizacji wpływają następujące czynniki.

Wygaśnięcie tokena

Nieużywany token Changes wygasa w ciągu 30 dni, dlatego musisz użyć strategii synchronizacji, która w takim przypadku zapobiega utracie informacji. Strategia może obejmować:

  • Wyszukaj w magazynie danych aplikacji ostatnio użyty rekord, który ma też id z Health Connect.
  • Poproś o zapisy z Health Connect, które zaczynają się od określonej sygnatury czasowej, a następnie wstaw lub zaktualizuj je w magazynie danych Twojej aplikacji.
  • Poproś o token zmian, aby zarezerwować go na przyszłość.

Zalecane strategie zarządzania zmianami

Jeśli Twoja aplikacja otrzymuje nieprawidłowe tokeny zmian lub wygasło, w zależności od ich zastosowania zalecamy zastosowanie tych strategii zarządzania:

  • Odczyt i usuwanie duplikatów wszystkich danych. To najlepsza strategia.
    • Zapisuje sygnaturę czasową ostatniego odczytu danych z Health Connect.
    • Po wygaśnięciu tokena ponownie odczytaj wszystkie dane z ostatniej sygnatury czasowej lub z ostatnich 30 dni. Następnie usuń duplikaty z odczytanych wcześniej danych za pomocą identyfikatorów.
    • Najlepiej wdrożyć identyfikatory klienta, ponieważ są one wymagane do aktualizacji danych.
  • Odczytuj tylko dane od ostatniej sygnatury czasowej odczytu. Powoduje to pewne rozbieżności danych w okresie wygaśnięcia tokena zmian, ale ten okres jest krótszy i może potrwać od kilku godzin do kilku dni.
    • Zapisuje sygnaturę czasową ostatniego odczytu danych z Health Connect.
    • Po wygaśnięciu tokena odczytuj wszystkie dane od tej sygnatury czasowej.
  • Usuń, a następnie odczytaj dane z ostatnich 30 dni. co pozwala uzyskać lepsze wyniki przy pierwszej integracji.
    • Usuń wszystkie dane odczytywane przez aplikację z Health Connect z ostatnich 30 dni.
    • Po usunięciu przeczytaj ponownie wszystkie te dane.
  • Odczytywanie danych z ostatnich 30 dni bez usuwania duplikatów To najmniej idealna strategia, która powoduje wyświetlanie użytkownikom zduplikowanych danych.
    • Usuń z Health Connect wszystkie dane odczytane przez aplikację z Health Connect z ostatnich 30 dni.
    • Zezwalaj na zduplikowane wpisy.

Tokeny zmiany typu danych

Jeśli aplikacja korzysta z więcej niż 1 typu danych niezależnie, użyj oddzielnych tokenów zmian dla każdego typu danych. W interfejsie API synchronizacji zmian używaj listy z wieloma typami danych tylko wtedy, gdy te typy danych są wykorzystywane razem albo nie są używane wcale.

Czytania na pierwszym planie

Aplikacje mogą odczytywać dane z Health Connect tylko wtedy, gdy działają na pierwszym planie. Podczas synchronizowania danych z Health Connect dostęp do tej usługi może zostać w każdej chwili przerwany. Na przykład aplikacja musi obsługiwać przerwy w trakcie synchronizacji podczas odczytu dużej ilości danych z Health Connect i kontynuować przy następnym uruchomieniu aplikacji.

Harmonogramy importowania

Aplikacja nie może otrzymywać powiadomień o nowych danych, dlatego sprawdź ich dostępność w 2 punktach:

  • Za każdym razem, gdy aplikacja staje się aktywna na pierwszym planie. W takim przypadku użyj zdarzeń cyklu życia.
  • Okresowo, gdy aplikacja pozostaje na pierwszym planie. Powiadom użytkowników o dostępności nowych danych i umożliwi im zaktualizowanie ekranu odpowiednio do zmian.