Menyinkronkan data

Sebagian besar aplikasi yang terintegrasi dengan Health Connect memiliki datastore sendiri yang berfungsi sebagai sumber kebenaran. Health Connect memberikan cara untuk membuat aplikasi Anda tetap sinkron.

Pastikan aplikasi Anda melakukan hal berikut:

  • Memasukkan data baru atau yang diperbarui dari datastore aplikasi ke Health Connect.
  • Mengambil perubahan data dari Health Connect, yang tercermin dalam datastore aplikasi Anda.
  • Menghapus data dari Health Connect saat dihapus di datastore aplikasi Anda.

Dalam setiap kasus, pastikan proses sinkronisasi menjaga Health Connect dan datastore aplikasi Anda tetap selaras.

Memasukkan data ke Health Connect

Bagian pertama proses sinkronisasi adalah memasukkan data dari datastore aplikasi ke datastore Health Connect.

Menyiapkan data Anda

Biasanya, data di datastore aplikasi memiliki detail berikut:

  • Kunci unik, seperti UUID.
  • Versi atau stempel waktu.

Desain datastore aplikasi Anda untuk memantau data yang telah dimasukkan ke Health Connect. Untuk melakukannya, terapkan logika berikut:

  • Berikan daftar perubahan dan token yang dapat digunakan untuk mengambil data yang memiliki update sejak token terakhir dikeluarkan.
  • Lacak waktu terakhir kali data yang diekspor diubah.

Langkah-langkah ini sangat penting untuk memastikan bahwa hanya data baru atau yang diperbarui yang dimasukkan ke Health Connect.

Menulis data ke Health Connect

Untuk memasukkan data ke Health Connect, lakukan langkah-langkah berikut:

  1. Dapatkan daftar entri baru atau yang diperbarui dari datastore aplikasi Anda.
  2. Untuk setiap entri, buat objek Record yang sesuai untuk jenis data tersebut. Misalnya, buat objek WeightRecord untuk data yang terkait dengan berat.
  3. Tentukan objek Metadata dengan setiap Record menggunakan detail kunci dan versi yang unik dari datastore aplikasi Anda: Jika data tidak memiliki versi, Anda dapat menggunakan nilai Long dari stempel waktu saat ini sebagai alternatif.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Perbarui dan masukkan data ke Health Connect menggunakan insertRecords. Memperbarui dan memasukkan data berarti bahwa setiap data yang ada di Health Connect akan ditimpa selama nilai clientRecordId ada di datastore Health Connect, dan clientRecordVersion lebih tinggi dari nilai yang ada. Jika tidak, data yang telah diperbarui dan dimasukkan akan ditulis sebagai data baru.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Untuk mempelajari pertimbangan praktis terkait memasukkan data, lihat praktik terbaik untuk Menulis data.

Menyimpan ID Health Connect

Setelah memperbarui dan memasukkan data ke Health Connect, datastore aplikasi Anda harus menyimpan id Health Connect untuk setiap data. Hal ini memungkinkan aplikasi Anda memeriksa apakah setiap perubahan yang masuk mengharuskan pembuatan data baru atau memperbarui data yang ada, setelah Anda menarik data.

Fungsi insertRecords menampilkan InsertRecordsResponse yang berisi daftar nilai id. Gunakan respons untuk mendapatkan ID Data dan menyimpannya.

val response = healthConnectClient.insertRecords(arrayListOf(record))

for (recordId in response.recordIdsList) {
    // Store recordId to your app's datastore
}

Mengambil data dari Health Connect

Bagian kedua dari proses sinkronisasi adalah mengambil perubahan data apa pun dari Health Connect ke datastore aplikasi Anda. Perubahan data dapat mencakup pembaruan dan penghapusan.

Mendapatkan token Perubahan

Untuk mendapatkan daftar perubahan yang akan diambil dari Health Connect, aplikasi Anda harus melacak token Perubahan. Anda dapat menggunakannya saat meminta Perubahan untuk menampilkan daftar perubahan data, dan token Perubahan baru untuk digunakan pada waktu berikutnya.

Untuk mendapatkan token Perubahan, panggil getChangesToken dan berikan jenis data yang diperlukan.

val changesToken = healthConnectClient.getChangesToken(
    ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)

Memeriksa perubahan data

Setelah Anda mendapatkan token Perubahan, gunakan token tersebut untuk mendapatkan semua Perubahan. Sebaiknya buat loop untuk menyelesaikan semua Perubahan tempat loop memeriksa apakah ada perubahan data yang tersedia. Ikuti langkah-langkah berikut:

  1. Panggil getChanges menggunakan token untuk mendapatkan daftar Perubahan.
  2. Periksa setiap perubahan apakah jenis perubahannya adalah UpsertionChange atau DeletionChange, dan lakukan operasi yang diperlukan.
    • Untuk UpsertionChange, hanya ambil perubahan yang tidak berasal dari aplikasi panggilan untuk memastikan Anda tidak mengimpor ulang data.
  3. Tetapkan token Perubahan berikutnya sebagai token baru.
  4. Ulangi Langkah 1-3 hingga tidak ada Perubahan yang tersisa.
  5. Simpan token berikutnya dan cadangkan untuk impor pada masa mendatang.
suspend fun processChanges(token: String): String {
    var nextChangesToken = token
    do {
        val response = healthConnectClient.getChanges(nextChangesToken)
        response.changes.forEach { change ->
            when (change) {
                is UpsertionChange ->
                    if (change.record.metadata.dataOrigin.packageName != context.packageName) {
                        processUpsertionChange(change)
                    }
                is DeletionChange -> processDeletionChange(change)
            }
        }
        nextChangesToken = response.nextChangesToken
    } while (response.hasMore)
    // Return and store the changes token for use next time.
    return nextChangesToken
}

Guna mempelajari pertimbangan praktis untuk mengambil data, lihat praktik terbaik untuk Menyinkronkan data.

Memproses perubahan data

Cerminkan perubahan pada datastore aplikasi Anda. Untuk UpsertionChange, gunakan id dan lastModifiedTime dari metadata-nya guna memperbarui dan memasukkan data. Untuk DeletionChange, gunakan id yang disediakan guna menghapus data.

Menghapus data dari Health Connect

Saat pengguna menghapus datanya sendiri dari aplikasi Anda, pastikan data tersebut juga dihapus dari Health Connect. Gunakan deleteRecords untuk melakukannya. Tindakan ini memerlukan daftar nilai id dan clientRecordId, yang memudahkan pengelompokan beberapa data untuk dihapus.