Synchronizuj dane

Większość aplikacji integrujących się z Health Connect ma własny magazyn danych, który służy jako źródło wiarygodnych informacji. Health Connect pozwala na synchronizację aplikacji.

Upewnij się, że aplikacja spełnia te wymagania:

  • Przekazuje do Health Connect nowe lub zaktualizowane dane z magazynu danych Twojej aplikacji.
  • Pobiera z Health Connect zmiany w danych, które są odzwierciedlone w magazynie danych aplikacji.
  • Usuwa dane z Health Connect, gdy zostaną usunięte z magazynu danych aplikacji.

W każdym przypadku zadbaj o to, aby proces synchronizacji zapewniał zgodność Health Connect oraz magazynu danych Twojej aplikacji.

Przesyłanie danych do Health Connect

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

Przygotowanie danych

Zwykle rekordy w magazynie danych aplikacji zawierają te informacje:

  • unikalny klucz, np. UUID;
  • Wersja lub sygnatura czasowa.

Zaprojektuj magazyn danych aplikacji tak, aby śledzić, jakie dane zostały już przekazane do Health Connect. Aby to osiągnąć, zastosuj następującą logikę:

  • Podaj listę zmian i token, za pomocą którego można pobrać rekordy, których zmiany zostały zaktualizowane od czasu ostatniego tokena.
  • Śledzenie ostatniej modyfikacji wyeksportowanych danych.

Wykonanie tych czynności jest niezbędne, aby do Health Connect były przekazywane tylko nowe lub zaktualizowane dane.

Zapisywanie danych w Health Connect

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

  1. Pobierz listę nowych lub zaktualizowanych wpisów z magazynu danych aplikacji.
  2. Dla każdego wpisu utwórz obiekt Record odpowiedni dla tego typu danych. Możesz np. utworzyć obiekt WeightRecord dla danych związanych z wagą.
  3. Określ obiekt Metadata z każdym elementem Record, używając unikalnego klucza i szczegółów wersji z magazynu danych aplikacji. Jeśli dane nie są obsługiwane w różnych wersjach, zamiast tego możesz 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. Upsert dane do Health Connect za pomocą insertRecords. Przez upsertowanie danych wszystkie dotychczasowe dane w Health Connect są zastępowane, o ile wartości clientRecordId istnieją w magazynie danych Health Connect i wartość clientRecordVersion jest wyższa od dotychczasowej. W przeciwnym razie upsertowane dane są zapisywane jako nowe dane.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Aby poznać praktyczne aspekty obsługi danych z pliku danych, zapoznaj się ze sprawdzonymi metodami zapisywania danych.

Przechowywanie identyfikatorów Health Connect

Po przeniesieniu rekordów do Health Connect magazyn danych Twojej aplikacji musi przechowywać id Health Connect dla każdego rekordu. Dzięki temu po pobraniu danych aplikacja będzie mogła sprawdzić, czy każda nadchodząca zmiana wymaga utworzenia nowego rekordu lub zaktualizowania istniejącego.

Funkcja insertRecords zwraca wartość InsertRecordsResponse, która zawiera listę wartości id. Użyj odpowiedzi, aby uzyskać i zapisać identyfikatory rekordów.

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

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

Pobieranie danych z Health Connect

Drugą częścią procesu synchronizacji jest pobranie wszelkich zmian danych z Health Connect do magazynu danych aplikacji. Mogą one obejmować aktualizacje i usunięcia.

Pobieranie tokena zmian

Aby uzyskać listę zmian do pobrania z Health Connect, aplikacja musi śledzić tokeny Changes. Możesz ich użyć przy wysyłaniu żądań Changes (zmiany), aby zwrócić zarówno listę zmian w danych, jak i nowy token Changes (zmiany) do użycia następnym razem.

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

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

Sprawdzanie, czy dane się zmieniły

Gdy uzyskasz token Zmiany, użyj go, aby pobrać wszystkie Zmiany. Zalecamy utworzenie pętli, dzięki której będziesz przeglądać wszystkie zmiany i sprawdzić, czy są dostępne zmiany w danych. Aby to zrobić:

  1. Wywołaj getChanges za pomocą tokena, aby uzyskać listę zmian.
  2. Sprawdź każdą zmianę, czy jest to typ UpsertionChange czy DeletionChange, i wykonaj niezbędne operacje.
    • Aby mieć pewność, że nie importujesz ponownie danych w przypadku funkcji UpsertionChange, uwzględnij tylko te zmiany, które nie pochodzą z aplikacji wywołującej.
  3. Przypisz kolejny token Changes (zmiany) jako nowy token.
  4. Powtarzaj kroki 1–3, dopóki nie skończą się zmiany.
  5. Zapisz 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 poznać praktyczne aspekty pobierania danych, zapoznaj się ze sprawdzonymi metodami synchronizowania danych.

Przetwarzaj zmiany danych

Odzwierciedla zmiany w magazynie danych aplikacji. W przypadku UpsertionChange rekordu id i lastModifiedTime z metadata należy użyć do upert rekordu. W przypadku DeletionChange rekord id służy do usuwania rekordu.

Usuwanie danych z Health Connect

Gdy użytkownik usunie swoje dane z aplikacji, upewnij się, że dane te zostały również usunięte z Health Connect. Aby to zrobić, użyj narzędzia deleteRecords. Uwzględnia to listę wartości id i clientRecordId, co ułatwia grupowanie wielu danych do usunięcia.