Datos agregados

En Health Connect, se pueden hacer agregaciones básicas o agregar datos en buckets. En los siguientes flujos de trabajo, se muestra cómo realizar ambas tareas.

Agregaciones básicas: acumulativas

En el siguiente ejemplo, se muestra cómo agregar datos a un tipo de datos.

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)
}

Agregaciones básicas: estadísticas

La agregación estadística calculará los valores mínimos, máximos o promedios.

Este es un ejemplo de agregación estadística:

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)
}

Buckets

Health Connect te permite agregar elementos a los buckets. Hay dos tipos de buckets que se pueden usar:

  • Duración: Cada bucket tiene una duración fija (por ejemplo, un minuto o una hora).
  • Período: Cada bucket tiene una longitud conceptual en el tiempo, por ejemplo, una semana o un mes.

Health Connect muestra una lista de buckets. Ten en cuenta que esta lista es dispersa, por lo que si un bucket no contiene datos, no estará en la lista.

A continuación, se muestra un ejemplo de cómo agregar pasos en buckets mensuales:

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
    }
}

Para agregar por Duration, el enfoque sigue el mismo patrón que antes, pero usa el método aggregateGroupByDuration(request: AggregateGroupByDurationRequest).