Data gabungan

Menggabungkan data di Health Connect dapat meliputi agregasi dasar atau data yang digabungkan ke dalam bucket. Alur kerja berikut menunjukkan cara melakukan keduanya.

Agregasi dasar: kumulatif

Contoh berikut menunjukkan cara menggabungkan data untuk suatu jenis data.

suspend fun aggregateDistance(client: HealthConnectClient): Double? {
    val request = AggregateRequest(
        metrics = setOf(Distance.DISTANCE_TOTAL),
        timeRangeFilter = TimeRangeFilter.between(START_TIME, END_TIME)
    )
    val response = client.aggregate(request)
    // The result may be null if no data is available to aggregate.
    return response.getMetric(Distance.DISTANCE_TOTAL)
}

Agregasi dasar: statistik

Agregasi statistik akan menghitung nilai minimum, maksimum, atau rata-rata.

Berikut contoh agregasi statistik:

suspend fun aggregateHROverTime(client: HealthConnectClient): Long? {
    val aggregate = client.aggregate(
        AggregateRequest(
            setOf(HeartRateSeries.BPM_MAX),
            timeRangeFilter = TimeRangeFilter.between(START_TIME, END_TIME),
            dataOriginFilter = listOf(
                DataOrigin("androidx.health.connect.client.sample")
            )
        )
    )
    // The result may be null if no data is available to aggregate.
    return aggregate.getMetric(HeartRateSeries.BPM_MAX)
}

Bucket

Health Connect memungkinkan Anda menggabungkan data ke dalam bucket. Ada dua jenis bucket yang dapat digunakan:

  • Durasi - setiap bucket memiliki durasi tetap, misalnya satu menit atau satu jam.
  • Periode - setiap bucket memiliki durasi konseptual, misalnya seminggu atau sebulan.

Health Connect menampilkan daftar bucket. Perlu diperhatikan bahwa daftar ini sparse. Jadi, jika bucket tidak berisi data, bucket tersebut tidak akan ada dalam daftar.

Berikut ini contoh langkah penggabungan ke dalam bucket bulanan:

suspend fun aggregateIntoMonths(healthConnectClient: HealthConnectClient) {
    val aggregateGroupByPeriodRequest = AggregateGroupByPeriodRequest(
        metrics = setOf(Steps.TOTAL),
        timeRangeFilter = TimeRangeFilter.between(START_TIME, END_TIME),
        timeRangeSlicer = Period.ofMonths(1)
    )
    val response = healthConnectClient.aggregateGroupByPeriod(
        aggregateGroupByPeriodRequest
    )
    response.forEach { period ->
        val totalSteps = period.result.getMetric(Steps.TOTAL) ?: 0L
    }
}

Untuk menggabungkan dengan Duration, pendekatan ini mengikuti pola yang sama seperti sebelumnya, tetapi menggunakan metode aggregateGroupByDuration(request: AggregateGroupByDurationRequest).