Menulis data

Panduan ini membahas proses penulisan atau pembaruan data di Health Connect.

Menyiapkan struktur data

Sebelum menulis data, kita perlu menyiapkan kumpulan data terlebih dahulu. Lebih dari 50 jenis data memiliki strukturnya masing-masing. Lihat referensi Jetpack untuk mengetahui detail selengkapnya tentang jenis data yang tersedia.

Kumpulan data dasar

Jenis data Langkah di Health Connect mendeteksi jumlah langkah pengguna di sela-sela pembacaan. Jumlah langkah mewakili pengukuran umum di berbagai platform kesehatan dan kebugaran.

Contoh berikut menunjukkan cara menetapkan data jumlah langkah:

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

Kumpulan data dengan satuan pengukuran

Health Connect dapat menyimpan nilai bersama dengan satuan pengukurannya untuk memberikan akurasi. Salah satu contohnya adalah jenis data Nutrisi yang luas dan komprehensif. Jenis data ini mencakup berbagai bidang gizi opsional, mulai dari total karbohidrat hingga vitamin. Setiap titik data mewakili gizi yang berpotensi dikonsumsi sebagai bagian dari makanan atau item makanan.

Dalam jenis data ini, semua nutrisi ditampilkan dalam satuan Mass, sementara energy ditampilkan dalam satuan Energy.

Contoh berikut menunjukkan cara menetapkan data gizi untuk pengguna yang telah makan pisang:

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
)

Kumpulan data dengan data serial

Health Connect dapat menyimpan daftar data serial. Salah satu contohnya adalah jenis data Detak Jantung yang menangkap serangkaian contoh detak jantung yang terdeteksi di antara pembacaan.

Dalam jenis data ini, parameter samples direpresentasikan oleh daftar contoh Detak Jantung. Setiap sampel berisi nilai beatsPerMinute dan nilai time.

Contoh berikut menunjukkan cara menetapkan data seri detak jantung:

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

Menulis data

Salah satu alur kerja umum di Health Connect adalah menulis data. Untuk menambahkan kumpulan data, gunakan insertRecords.

Contoh berikut menunjukkan cara menulis data dengan menyisipkan jumlah langkah:

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

Memperbarui data

Jika perlu mengubah satu atau beberapa kumpulan data, terutama saat Anda perlu menyinkronkan datastore aplikasi dengan data dari Health Connect, Anda dapat memperbarui data. Ada dua cara untuk memperbarui data yang ada, yang bergantung pada ID yang digunakan untuk menemukan kumpulan data.

Metadata

Sebaiknya periksa class Metadata terlebih dahulu karena hal ini diperlukan saat memperbarui data. Saat pembuatan, setiap Record di Health Connect memiliki kolom metadata. Properti berikut relevan dengan sinkronisasi:

Properti Deskripsi
id Setiap Record di Health Connect memiliki nilai id yang unik.
Health Connect akan otomatis mengisi ini saat menyisipkan kumpulan data baru.
lastModifiedTime Setiap Record juga melacak kapan terakhir kali kumpulan data diubah.
Health Connect otomatis mengisinya.
clientRecordId Setiap Record dapat memiliki ID unik yang terkait dengannya untuk digunakan sebagai referensi di datastore aplikasi Anda.
Aplikasi Anda menyediakan nilai ini.
clientRecordVersion Jika kumpulan data memiliki clientRecordId, clientRecordVersion dapat digunakan untuk memungkinkan data tetap sinkron dengan versi di datastore aplikasi.
Aplikasi Anda menyediakan nilai ini.

Memperbarui melalui ID Kumpulan Data

Untuk memperbarui data, siapkan kumpulan data yang diperlukan terlebih dahulu. Lakukan perubahan pada kumpulan data jika diperlukan. Selanjutnya, panggil updateRecords untuk melakukan perubahan.

Contoh berikut menunjukkan cara mengupdate data. Untuk tujuan ini, setiap kumpulan data memiliki nilai offset zona yang disesuaikan menjadi 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
    }
}

Memperbarui dan Menyisipkan melalui ID Kumpulan Data Klien

Jika Anda menggunakan nilai ID Kumpulan Data Klien dan Versi Kumpulan Data Klien opsional, sebaiknya gunakan insertRecords, bukan updateRecords.

Fungsi insertRecords memiliki kemampuan untuk memperbarui dan menyisipkan data. Jika data ada di Health Connect berdasarkan serangkaian ID Kumpulan Data Klien tertentu, data tersebut akan ditimpa. Jika tidak, data akan ditulis sebagai data baru. Skenario ini berguna setiap kali Anda perlu menyinkronkan data dari datastore aplikasi ke Health Connect.

Contoh berikut menunjukkan cara melakukan pembaruan dan penyisipan pada data yang diambil dari datastore aplikasi:

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

Setelah itu, Anda dapat memanggil fungsi ini di thread utama.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

Pemeriksaan nilai di Versi Kumpulan Data Klien

Jika proses pembaruan dan penyisipan data Anda mencakup Versi Kumpulan Data Klien, Health Connect akan melakukan pemeriksaan perbandingan dalam nilai clientRecordVersion. Jika versi dari data yang disisipkan lebih tinggi daripada versi dari data yang ada, pembaruan dan penyisipan akan terjadi. Jika tidak, proses akan mengabaikan perubahan dan nilainya tetap sama.

Untuk menyertakan pembuatan versi dalam data, Anda harus menyediakan Metadata.clientRecordVersion dengan nilai Long berdasarkan logika pembuatan versi.

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

Pembaruan dan penyisipan tidak otomatis menambah version setiap kali ada perubahan, sehingga mencegah instance yang tidak terduga menimpa data. Dengan demikian, Anda harus menyediakannya dengan nilai yang lebih tinggi secara manual.

Praktik terbaik

Setelah membuat logika, pertimbangkan untuk mengikuti praktik terbaik saat menulis atau memperbarui data.