Zapisywanie danych

Ten przewodnik opisuje proces zapisywania i aktualizowania danych w Health Connect.

Skonfiguruj strukturę danych

Przed zapisaniem danych musimy najpierw skonfigurować rekordy. Jeśli masz więcej niż 50 danych każdy ma swoją strukturę. Więcej informacji o danych znajdziesz w dokumentacji Jetpacka. typy dostępnych typów.

Rekordy podstawowe

Typ danych Kroki w Health Connect rejestruje liczbę kroków między odczytami. Liczba kroków to typowy pomiar na platformach dotyczących zdrowia, fitnessu i dobrego samopoczucia.

Poniższy przykład pokazuje, jak skonfigurować dane o liczbie kroków:

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Rekordy z jednostkami miary

Health Connect może przechowywać wartości wraz z jednostkami miary, dokładności. Jednym z przykładów jest bardzo duży typ danych Żywienie. kompleksowego. Obejmuje on różnorodne opcjonalne pola odżywcze, od węglowodanów do witamin. Każdy punkt danych reprezentuje składniki odżywcze potencjalnie spożyte w ramach posiłku lub produktu spożywczego.

W tym typie danych wszystkie składniki odżywcze są przedstawiane w jednostkach Mass, a energy jest przedstawiane w jednostce Energy.

Z przykładu poniżej dowiesz się, jak ustawić dane dotyczące odżywiania dla użytkownika, który: zjadł banana:

val banana = NutritionRecord(
    name = "banana",
    energy = 105.0.kilocalories,
    dietaryFiber = 3.1.grams,
    potassium = 0.422.grams,
    totalCarbohydrate = 27.0.grams,
    totalFat = 0.4.grams,
    saturatedFat = 0.1.grams,
    sodium = 0.001.grams,
    sugar = 14.0.grams,
    vitaminB6 = 0.0005.grams,
    vitaminC = 0.0103.grams,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Rekordy z danymi serii

Health Connect może przechowywać listę danych serii. Jednym z przykładów jest typ danych Tętno, który rejestruje serię próbek tętna. między odczytami.

W tym typie danych parametr samples jest reprezentowany przez listę Próbki tętna. Każda próbka zawiera pole beatsPerMinute i time.

Poniższy przykład pokazuje, jak ustawić dane dotyczące serii tętna:

val heartRateRecord = HeartRateRecord(
    startTime = START_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endTime = END_TIME,
    endZoneOffset = END_ZONE_OFFSET,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = START_TIME + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    }
)

Zapisywanie danych

Jednym z typowych przepływów pracy w Health Connect jest zapisywanie danych. Aby dodać rekordy: użyj insertRecords.

Ten przykład pokazuje, jak zapisywać liczbę kroków wstawianych danych:

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = START_TIME,
            endTime = END_TIME,
            startZoneOffset = START_ZONE_OFFSET,
            endZoneOffset = END_ZONE_OFFSET
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

Zaktualizuj dane

Jeśli musisz zmienić jeden lub więcej rekordów, zwłaszcza gdy zsynchronizować magazyn danych aplikacji z danymi z Health Connect, możesz zaktualizować danych. Istnieją 2 sposoby aktualizowania istniejących danych, Identyfikator używany do wyszukiwania rekordów.

Metadane

Warto najpierw zapoznać się z zajęciami Metadata, ponieważ jest to konieczne, aktualizowania danych. Po utworzeniu każda Record w Health Connect ma przypisaną metadata. Te właściwości są powiązane z: synchronizacja:

Właściwości Opis
id Każde Record w Health Connect ma unikalne id .
Health Connect wypełni tę wartość automatycznie podczas wstawiania nowego rekordu.
lastModifiedTime W sekcji Record zapisywane są również informacje o czasie ostatniego wyświetlenia przez użytkownika rekord został zmodyfikowany.
Health Connect wypełni tę wartość automatycznie.
clientRecordId Każdy element Record może mieć unikalny identyfikator powiązany z i używać go jako odniesienia w magazynie danych aplikacji.
Taka wartość jest Twoja aplikacja.
clientRecordVersion Jeśli rekord zawiera element clientRecordId, parametr clientRecordVersion może służyć do zezwalania na dane na: synchronizuj je z wersją w aplikacji magazyn danych.
Taka wartość jest Twoja aplikacja.

Zaktualizuj przez identyfikator rekordu

Aby zaktualizować dane, przygotuj najpierw wymagane rekordy. Wprowadź wszelkie zmiany w w razie potrzeby. Następnie zadzwoń pod numer updateRecords, aby zmian.

Z przykładu poniżej dowiesz się, jak zaktualizować dane. W tym celu każdy rekord wartości przesunięcia strefy są dostosowane do czasu PST.

suspend fun updateSteps(
    healthConnectClient: HealthConnectClient,
    prevRecordStartTime: Instant,
    prevRecordEndTime: Instant
) {
    try {
        val request = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(
                    prevRecordStartTime,
                    prevRecordEndTime
                )
            )
        )

        val newStepsRecords = arrayListOf<StepsRecord>()
        for (record in request.records) {
            // Adjusted both offset values to reflect changes
            val sr = StepsRecord(
                count = record.count,
                startTime = record.startTime,
                startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
                endTime = record.endTime,
                endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
                metadata = record.metadata
            )
            newStepsRecords.add(sr)
        }

        client.updateRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

Wstaw za pomocą identyfikatora rekordu klienta

Jeśli używasz opcjonalnych wartości Client Record ID (Identyfikator rekordu klienta) i Client Record Version (Wersja rekordu klienta), zalecamy używanie insertRecords zamiast updateRecords.

Funkcja insertRecords może wyświetlać dane przez upsert. Jeśli dane istnieją w Health Connect na podstawie danego zbioru identyfikatory rekordu klienta – zostaną zastąpione. W przeciwnym razie jest zapisywany jako nowe dane. Ten scenariusz jest przydatny, gdy chcesz zsynchronizować dane z z aplikacji do zarządzania danymi o zdrowiu.

Ten przykład pokazuje, jak wykonać upsert na danych pobranych z do magazynu danych aplikacji:

suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        // Assign parameters for this record
        metadata = Metadata(
            clientRecordId = cid
        )
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

suspend fun upsertSteps(
    healthConnectClient: HealthConnectClient,
    newStepsRecords: ArrayList<StepsRecord>
) {
    try {
        healthConnectClient.insertRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

Potem możesz je wywoływać w wątku głównym.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

Sprawdzanie wartości w wersji rekordu klienta

Jeśli proces wprowadzania danych obejmuje wersję rekordu klienta, stan Connect wykonuje testy porównawcze w narzędziu clientRecordVersion. . Jeśli wersja z wstawionych danych jest wyższa niż z istniejących danych, następuje wywołanie upsert. W przeciwnym razie zignoruje zmianę, a wartość pozostanie taka sama.

Aby uwzględnić obsługę wersji w danych, musisz dostarczyć Metadata.clientRecordVersion z wartością Long na podstawie Twojej wersji logikę logiczną.

val sr = StepsRecord(
    count = count,
    startTime = startTime,
    startZoneOffset = startZoneOffset,
    endTime = endTime,
    endZoneOffset = endZoneOffset,
    metadata = Metadata(
        clientRecordId = cid,
        clientRecordVersion = version
    )
)

Upsert nie zwiększają automatycznie wartości version po wprowadzeniu zmian. co zapobiega nieoczekiwanym przypadkom zastępowania danych. Dlatego musisz ręcznie wprowadzić większą wartość.

Sprawdzone metody zapisu danych

Aplikacje mogą zapisywać w Health Connect tylko dane pochodzące od siebie.

Jeśli dane w aplikacji zostały zaimportowane z innej aplikacji, obowiązkiem trafia na inną aplikację, aby zapisać własne dane w Health Connect.

Warto też wdrożyć logikę, która obsługuje wyjątki, takie jak dane są poza granicami lub wystąpił wewnętrzny błąd systemu. Możesz zastosować strategii ponawiania i ponawiania w mechanizmie planowania zadań. Jeśli piszesz na Aplikacja Health Connect kończy się niepowodzeniem. Upewnij się, że aplikacja może zostać przeniesiona danego punktu eksportu. Nie zapomnij zapisać i zgłosić błędów, aby ułatwić diagnostykę.

Przy śledzeniu danych możesz skorzystać z kilku wskazówek, w zależności od sposobu zapisu danych przez aplikację.

Śledzenie pasywne

Obejmuje to aplikacje, które wykonują pasywne śledzenie aktywności lub zdrowia, stale rejestrując kroki lub tętno w tle.

Aplikacja musi okresowo zapisywać dane w Health Connect na w następujący sposób:

  • Przy każdej synchronizacji zapisuj tylko nowe dane i zaktualizowane dane, które zostały zmodyfikowane od przy ostatniej synchronizacji.
  • Podziel żądania na fragment do maksymalnie 1000 rekordów na żądanie zapisu.
  • Korzystaj z WorkManager, aby planować okresowe zadania w tle, co najmniej 15 minut.
  • Ogranicz zadania tak, aby były uruchamiane tylko wtedy, gdy urządzenie jest nieaktywne i nie jest zbyt niskie baterii.

    val constraints = Constraints.Builder()
        .requiresBatteryNotLow()
        .requiresDeviceIdle(true)
        .build()
    
    val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
            15,
            TimeUnit.MINUTES,
            5,
            TimeUnit.MINUTES
        )
        .setConstraints(constraints)
        .build()
    

Aktywne śledzenie

Dotyczy to aplikacji, które śledzą zdarzeniami, np. ćwiczeń, snu, lub ręczne wprowadzanie danych, np. żywienie. Rekordy są tworzone, gdy aplikacja znajduje się na pierwszym planie lub w rzadkich sytuacjach, gdy jest używane kilka razy dziennie.

Sprawdź, czy aplikacja nie działa przez cały czas trwania Health Connect w czasie trwania zdarzenia.

Dane należy zapisywać w Health Connect na 1 z 2 sposobów:

  • Zsynchronizuj dane z Health Connect po zakończeniu zdarzenia. Na przykład zsynchronizuj dane, gdy użytkownik zakończy śledzone ćwiczenia.
  • Planowanie jednorazowego zadania przy użyciu WorkManager do synchronizowania danych później.

Sprawdzone metody dotyczące szczegółowości i częstotliwości zapisów

Zapisując dane w Health Connect, używaj odpowiedniej rozdzielczości. Korzystanie z odpowiednia rozdzielczość pomaga zmniejszyć obciążenie pamięci masowej, przy zachowaniu spójne i dokładne dane. Rozpoznawanie danych obejmuje 2 kwestie:

  1. Częstotliwość zapisów: jak często aplikacja przekazuje nowe dane do Health Connect. np. zapisywać nowe dane co 15 minut.
  2. Szczegółowość zapisanych danych: jak często przesyłane dane były próbkowane. Na przykład zapisuj próbki tętna co 5 s. Nie każdy typ danych wymaga takiej samej częstotliwości próbkowania. Aktualizowanie liczby kroków nie ma zbyt wielu korzyści danych co sekundę, a nie rzadziej, np. co 60 sek. Wyższe częstotliwości próbkowania mogą jednak zapewniać użytkownikom szczegółowe dane o zdrowiu i aktywności fizycznej. Częstotliwość próbkowania który powinien znaleźć równowagę między szczegółami a skutecznością.

Zapisuj dane monitorowane w ciągu dnia

W przypadku danych zbieranych na bieżąco, takich jak kroki, aplikacja powinna zapisywać w Health Connect co najmniej raz w ciągu dnia 15 minut.

Typ danych

Jednostka

Oczekiwana

Przykład

Kroki

kroki

Co minutę

23:14–23:15 – 5 kroków

23:16-23:17 – 22 kroki

23:17–23:18 – 8 kroków

Kadencja kroków

kroki/min

Co minutę

23:14–23:15 – 5 kr./min

23:16–23:17, 22 kr./min

23:17–23:18 – 20:00

Pchnięcia wózka inwalidzkiego

wypychanie

Co minutę

23:14–23:15 – 5 uderzeń

23:16–23:17 – 22 pchnięcia

23:17–23:18 – 8 pchnięć

Aktywne kalorie

Kalorie

Co 15 minut

23:15 - 23:30 - 2 kalorie

23:30 - 23:45 - 25 kcal

23:45 - 00:00 - 5 kalorii

Wszystkie spalone kalorie

Kalorie

Co 15 minut

23:15 - 23:30 - 16 kalorii

23:30 - 23:45 - 16 kalorii

23:45 - 00:00 - 16 kalorii

Odległość

km/min

Co minutę

23:14–23:15 – 0,008 km

23:16-23:16-0,021 km

23:17–23:18 – 0,012 km

Przebyte przewyższenie

min

Co minutę

20:36-20:37-3,048

20:39-20:40-3,048

23:23–23:24 – 9,144

Pokonane piętra

piętra

Co minutę

23:14–23:15 – 5 pięter

23:16–23:16 – 22 piętra

23:17–23:18 – 8 pięter

Tętno

uderz./min

Co minutę

6:11–55 uderz./min

Zmienność rytmu serca

ms

Co minutę

6:11–23 ms

Częstość oddychania

oddechy/min

Co minutę

23:14-23:15 – 60 oddechów/min

23:16-23:16 – 62 oddechy/min

23:17-23:18 – 64 oddechy/min

Nasycenie tlenem

%

Co godzinę

6:11–95,208%

Zapisywanie sesji

Dane powinny być zapisywane w Health Connect po zakończeniu treningu lub snu .

Zalecamy, aby każda sesja snu lub sesje ćwiczeń były zapisywane w urządzenie nagrywające i odpowiednie metadane, w tym RecordingMethod

Zgłoszenie powinno być zgodne z wytycznymi podanymi w sekcji „Oczekiwane” kolumnę poniżej. Gdzie użyj „najlepszego”, ze wskazówkami.

Dane śledzone podczas ćwiczenia

Typ danych

Jednostka

Oczekiwana

Pozdrawiam

Przykład

Kroki

kroki

Co minutę

Co sekundę

23:14–23:15 – 5 kroków

23:16-23:17 – 22 kroki

23:17–23:18 – 8 kroków

Kadencja kroków

kroki/min

Co minutę

Co sekundę

23:14–23:15 – 35 kr./min

23:16–23:17 – 37 kr./min

23:17–23:18 – 40 kr./min

Pchnięcia wózka inwalidzkiego

wypychanie

Co minutę

Co sekundę

23:14–23:15 – 5 uderzeń

23:16–23:17 – 22 pchnięcia

23:17–23:18 – 8 pchnięć

Ścieżka rowerowa

obr./min

Co minutę

Co sekundę

23:14–23:15 – 65 obr./min

23:16-23:17 - 70 obr./min

23:17-23:18-68 obr./min

Zasilanie

waty

Co minutę

Co sekundę

23:14–23:15 – 250 watów

23:16–23:17 – 255 watów

23:17–23:18 – 245 watów

Szybkość

km/min

Co minutę

Co sekundę

23:14–23:15 – 0,3 km/min

23:16-23:17 - 0,4 km/min

23:17-23:18 -0,4 km/min

Odległość

km/m

Co minutę

Co sekundę

23:14–23:15 – 0,008 km

23:16-23:16-0,021 km

23:17–23:18 – 0,012 km

Aktywne kalorie

Kalorie

Co minutę

Co sekundę

23:14-23:15 - 20 kalorii

23:16 - 23:17 - 20 kalorii

23:17 - 23:18 - 25 kcal

Wszystkie spalone kalorie

Kalorie

Co minutę

Co sekundę

23:14-23:15 - 36 kalorii

23:16 - 23:17 - 36 kcal

23:17 - 23:18 - 41 kcal

Przebyte przewyższenie

min

Co minutę

Co sekundę

20:36-20:37-3,048

20:39-20:40-3,048

23:23–23:24 – 9,144

Trasy ćwiczeń

szer./dł./sł./sł.

Co 3–5 sekund

Co sekundę

Tętno

uderz./min

Co minutę

Co sekundę

23:14–23:15–150 uderz./min

23:16–23:17–152 uderz./min

23:17–23:18–155 uderz./min

Dane śledzone podczas snu

Typ danych

Jednostka

Oczekiwane próbki

Przykład

Ocena snu

etapie

Szczegółowe przedziały czasu dla poszczególnych faz snu

23:46–23:50 – obudzenie

23:50–23:56 – sen płytki

23:56-00:16 – sen głęboki

Tętno spoczynkowe

uderz./min

Jedna wartość dzienna (oczekiwana z rana)

6:11–60 uderz./min

Nasycenie tlenem

%

Jedna wartość dzienna (oczekiwana z rana)

6:11–95,208%