Đọc dữ liệu tổng hợp

Tổng hợp dữ liệu trong Health Connect có thể bao gồm phương pháp tổng hợp cơ bản hoặc việc tổng hợp dữ liệu thành các nhóm. Quy trình làm việc dưới đây sẽ hướng dẫn bạn cách thực hiện cả hai.

Phương pháp tổng hợp cơ bản

Để sử dụng phương pháp tổng hợp cơ bản trên dữ liệu của bạn, hãy dùng hàm aggregate trên đối tượng HealthConnectClient. Phương pháp này chấp nhận đối tượng AggregateRequest, trong đó bạn thêm các loại chỉ số và khoảng thời gian làm tham số. Cách gọi phương pháp tổng hợp cơ bản phụ thuộc vào loại chỉ số được sử dụng.

Phương pháp tổng hợp tích luỹ

Phương pháp tổng hợp tích luỹ sẽ tính tổng giá trị.

Ví dụ sau đây cho bạn thấy cách tổng hợp dữ liệu cho một loại dữ liệu:

suspend fun aggregateDistance(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val distanceTotalInMeters = response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

Phương pháp tổng hợp thống kê

Phương pháp tổng hợp thống kê tính toán các giá trị tối thiểu, tối đa hoặc trung bình của bản ghi có mẫu.

Ví dụ sau đây minh hoạ cách sử dụng phương pháp tổng hợp thống kê:

suspend fun aggregateHeartRate(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response =
            healthConnectClient.aggregate(
                AggregateRequest(
                    setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
                )
            )
        // The result may be null if no data is available in the time range
        val minimumHeartRate = response[HeartRateRecord.BPM_MIN]
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX]
    } catch (e: Exception) {
        // Run error handling here
    }
}

Nhóm

Health Connect cũng có thể cho phép bạn tổng hợp dữ liệu thành các nhóm. Bạn có thể dùng 2 loại nhóm là thời lượngkhoảng thời gian.

Sau khi được gọi, loại nhóm sẽ trả về một danh sách nhóm. Lưu ý rằng danh sách có thể thưa thớt, do đó, nhóm sẽ không được đưa vào danh sách nếu không chứa dữ liệu nào.

Thời lượng

Trong trường hợp này, dữ liệu tổng hợp được chia thành các nhóm trong một thời lượng cố định, chẳng hạn như một phút hoặc một giờ. Để tổng hợp dữ liệu thành các nhóm, hãy dùng aggregateGroupByDuration. Phương pháp này chấp nhận đối tượng AggregateGroupByDurationRequest, trong đó bạn thêm các loại chỉ số, khoảng thời gian và Duration làm tham số.

Sau đây là ví dụ về những bước tổng hợp thành các nhóm có thời lượng một phút:

suspend fun aggregateStepsIntoMinutes(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByDuration(
                AggregateGroupByDurationRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Duration.ofMinutes(1L)
                )
            )
        for (durationResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = durationResult.result[StepsRecord.COUNT_TOTAL]
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Khoảng thời gian

Trong trường hợp này, dữ liệu tổng hợp được chia thành các nhóm trong một khoảng thời gian dựa trên ngày, chẳng hạn như một tuần hoặc một tháng. Để tổng hợp dữ liệu thành các nhóm, hãy dùng aggregateGroupByPeriod. Phương pháp này chấp nhận đối tượng AggregateGroupByPeriodRequest, trong đó bạn thêm các loại chỉ số, khoảng thời gian và Period làm tham số.

Sau đây là ví dụ về những bước tổng hợp thành các nhóm theo tháng:

suspend fun aggregateStepsIntoMonths(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByPeriod(
                AggregateGroupByPeriodRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Period.ofMonths(1)
                )
            )
        for (monthlyResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = monthlyResult.result[StepsRecord.COUNT_TOTAL]
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Giới hạn 30 ngày đối với việc đọc dữ liệu

Ứng dụng có thể đọc dữ liệu từ Health Connect trong vòng tối đa 30 ngày trước thời điểm cấp quyền lần đầu.

Tuy nhiên, nếu người dùng xoá ứng dụng của bạn, nhật ký cấp quyền sẽ bị mất. Nếu người dùng cài đặt lại ứng dụng của bạn và cấp lại quyền, thì ứng dụng có thể đọc dữ liệu của Health Connect trong vòng tối đa 30 ngày trước ngày mới đó.

Ví dụ

Nếu người dùng cấp cho ứng dụng của bạn quyền đọc dữ liệu lần đầu là vào ngày 30 tháng 3 năm 2023, thì dữ liệu cũ nhất mà ứng dụng có thể đọc sẽ là từ ngày 28 tháng 2 năm 2023 trở đi.

Sau đó, người dùng xoá ứng dụng của bạn vào ngày 10 tháng 5 năm 2023. Người dùng quyết định cài đặt lại vào ngày 15 tháng 5 năm 2023 và cấp quyền đọc. Lúc này, ứng dụng của bạn có thể đọc dữ liệu từ ngày 15 tháng 4 năm 2023.