Écrire des données

Ce guide explique comment écrire ou mettre à jour des données dans Santé Connect.

Configurer la structure des données

Avant d'écrire des données, nous devons configurer les enregistrements. Pour plus de 50 types de données, chacun présente sa propre structure. Consultez la documentation de référence de Jetpack pour en savoir plus sur les types de données disponibles.

Enregistrements de base

Le type de données Pas dans Santé Connect enregistre le nombre de pas qu'un utilisateur a effectués entre deux lectures. Le nombre de pas est une unité de mesure courante pour les plates-formes de santé, de remise en forme et de bien-être.

L'exemple suivant montre comment définir les données relatives au nombre de pas :

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

Enregistrements avec unités de mesure

Pour plus de précision, Santé Connect peut stocker les valeurs avec leur unité de mesure. Par exemple, le type de données Nutrition est vaste et complet. Il comprend une grande variété de champs de nutriments facultatifs, tels que la quantité totale de glucides ou les vitamines. Chaque point de données représente les nutriments qui ont pu être consommés dans le cadre d'un repas ou d'un aliment.

Dans ce type de données, tous les nutriments sont représentés par des unités de masse (Mass), alors que l'energy est représentée en unité d'Energy.

L'exemple suivant montre comment définir des données nutritionnelles pour un utilisateur qui a mangé une banane :

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
)

Enregistrements avec données séquentielles

Santé Connect peut stocker une liste de données séquentielles. Le type de données Fréquence cardiaque en est un bon exemple. Il capture une série d'échantillons de pulsation détectés entre les lectures.

Dans ce type de données, le paramètre samples est représenté par une liste d'échantillons de la fréquence cardiaque. Chaque exemple contient une valeur beatsPerMinute et une valeur time.

L'exemple suivant montre comment définir des données séquentielles pour la fréquence cardiaque :

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

Écrire des données

L'un des workflows courants de Santé Connect consiste à écrire des données. Pour ajouter des enregistrements, utilisez insertRecords.

L'exemple suivant montre comment écrire des données pour insérer le nombre de pas :

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

Mettre à jour des données

Si vous devez modifier un ou plusieurs enregistrements, en particulier lorsque vous devez synchroniser le datastore de votre application avec les données de Santé Connect, vous pouvez les mettre à jour. Il existe deux façons de mettre à jour des données existantes en fonction de l'identifiant utilisé pour rechercher les enregistrements.

Métadonnées

Il est utile d'examiner d'abord la classe Metadata, car cela est nécessaire pour mettre à jour les données. Lors de la création, chaque Record dans Santé Connect comporte un champ metadata. Les propriétés suivantes sont pertinentes pour la synchronisation :

Propriétés Description
id Chaque Record dans Santé Connect a une valeur id unique.
Santé Connect la renseigne automatiquement lorsque vous insérez un nouvel enregistrement.
lastModifiedTime Chaque Record conserve la date de sa dernière modification.
Santé Connect renseigne automatiquement cette information.
clientRecordId Chaque Record peut être associé à un identifiant unique qui servira de référence dans le datastore de votre application.
Votre application fournit cette valeur.
clientRecordVersion Lorsqu'un enregistrement est associé à un clientRecordId, vous pouvez utiliser clientRecordVersion pour permettre aux données de rester synchronisées avec la version du datastore de votre application.
Votre application fournit cette valeur.

Mettre à jour les données via un identifiant d'enregistrement

Pour mettre à jour les données, préparez d'abord les enregistrements nécessaires. Si nécessaire, modifiez les enregistrements. Appelez ensuite updateRecords pour effectuer les modifications.

L'exemple suivant montre comment mettre à jour des données. À cette fin, les valeurs de décalage de zone de chaque enregistrement sont définies sur 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
    }
}

Insérer les données mises à jour via l'identifiant de l'enregistrement client

Si vous utilisez les valeurs facultatives d'identifiant et de version de l'enregistrement client, nous vous recommandons d'utiliser insertRecords au lieu de updateRecords.

La fonction insertRecords peut insérer les données mises à jour. Si les données existent dans Santé Connect en fonction de l'ensemble donné d'identifiants d'enregistrements client, elles sont écrasées. Sinon, elles sont écrites en tant que nouvelles données. Ce scénario est utile lorsque vous devez synchroniser les données du datastore de votre application avec Santé Connect.

L'exemple suivant montre comment effectuer une opération d'insertion des données mises à jour à partir du datastore de l'application :

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

Vous pourrez ensuite appeler ces fonctions dans votre thread principal.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

Vérification des valeurs dans la version de l'enregistrement client

Si votre processus d'insertion des données mises à jour inclut la version de l'enregistrement client, Santé Connect effectue des vérifications des valeurs clientRecordVersion. Si la version des données insérées est ultérieure à celle des données existantes, l'insertion des données se produit. Sinon, le processus ignore la modification, et la valeur reste la même.

Pour inclure la gestion des versions dans vos données, vous devez fournir à Metadata.clientRecordVersion une valeur Long basée sur votre logique de gestion des versions.

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

Les insertions n'incrémentent pas automatiquement la version à chaque modification, ce qui évite tout écrasement inattendu des données. Vous devez donc lui attribuer manuellement une valeur plus élevée.

Bonnes pratiques pour l'écriture de données

Les applications ne doivent écrire dans Santé Connect que des données dont elles sont la source.

Si les données ont été importées depuis une autre application, la responsabilité d'écriture dans Santé Connect incombe à cette application.

Il est également conseillé d'implémenter une logique qui gère les exceptions d'écriture (par exemple, les données qui se trouvent en dehors des limites ou les erreurs système internes). Vous pouvez appliquer vos stratégies d'intervalle entre les tentatives et de nouvelles tentatives au niveau d'un mécanisme de planification des tâches. Si l'écriture sur Santé Connect échoue, assurez-vous que votre application peut passer outre ce point d'exportation. N'oubliez pas de consigner et de signaler les erreurs pour faciliter le diagnostic.

Lorsque vous suivez les données, quelques suggestions peuvent vous aider en fonction de la manière dont votre application écrit les données.

Suivi passif

Cela inclut les applications qui effectuent un suivi passif de la condition physique ou de la santé, comme l'enregistrement continu d'un nombre de pas ou d'une fréquence cardiaque.

Votre application doit écrire régulièrement des données dans Santé Connect comme suit :

  • Lors de chaque synchronisation, n'écrivez que les nouvelles données et les données mises à jour qui ont été modifiées depuis la dernière synchronisation.
  • Limitez les requêtes à 1 000 enregistrements par requête d'écriture.
  • Utilisez WorkManager pour planifier les tâches périodiques en arrière-plan, d'une durée minimale de 15 minutes.
  • Permettez l'exécution des tâches uniquement lorsque l'appareil est inactif et qu'il n'est pas à court de batterie.

    val constraints = Constraints.Builder()
        .requiresBatteryNotLow()
        .requiresDeviceIdle(true)
        .build()
    
    val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
            15,
            TimeUnit.MINUTES,
            5,
            TimeUnit.MINUTES
        )
        .setConstraints(constraints)
        .build()
    

Suivi actif

Cela inclut les applications qui effectuent le suivi des événements comme les entraînements et le sommeil, ou les entrées manuelles des utilisateurs, comme la nutrition. Ces enregistrements sont créés lorsque l'application est exécutée au premier plan ou sont des événements occasionnels qui se produisent tout au plus quelques fois par jour.

Assurez-vous que votre application n'entraîne pas l'exécution continue de Santé Connect pendant toute la durée de l'événement.

Les données doivent être écrites dans Santé Connect de l'une des deux manières suivantes :

  • Synchronisez les données avec Santé Connect une fois l'événement terminé (par exemple, lorsque l'utilisateur met fin à un entraînement dont le suivi était effectué).
  • Planifiez une tâche ponctuelle à l'aide de WorkManager pour synchroniser les données ultérieurement.

Bonnes pratiques concernant la précision et la fréquence des écritures

Lorsque vous écrivez des données dans Santé Connect, utilisez une résolution appropriée. L'utilisation de la résolution appropriée permet de réduire la charge de stockage, tout en préservant la cohérence et la précision des données. La résolution de données englobe deux éléments:

  1. Fréquence des écritures: fréquence à laquelle votre application envoie de nouvelles données à Santé Connect. Par exemple, écrivez de nouvelles données toutes les 15 minutes.
  2. Précision des données écrites: fréquence à laquelle les données transmises ont été échantillonnées. Par exemple, écrivez des échantillons de fréquence cardiaque toutes les 5 s. Tous les types de données ne nécessitent pas le même taux d'échantillonnage. Mettre à jour les données sur le nombre de pas toutes les secondes présente peu d'avantages, par rapport à une cadence moins fréquente (toutes les 60 secondes, par exemple). Toutefois, des taux d'échantillonnage plus élevés peuvent donner aux utilisateurs un aperçu plus détaillé de leurs données de santé et de remise en forme. Les fréquences d'échantillonnage doivent trouver un juste milieu entre le niveau de détail et les performances.

Accès en écriture aux données surveillées tout au long de la journée

Pour les données collectées en continu, telles que les pas, votre application doit écrire à Santé Connect au moins toutes les 15 minutes tout au long de la journée.

Type de données

Unité

Disponibilité

Exemple

Étapes

pas

Toutes les minutes

23:14 - 23:15 - 5 pas

23:16 - 23:17 - 22 pas

23:17 - 23:18 - 8 pas

Rythme de pas

pas/min

Toutes les minutes

23:14-23:15-17:00

23:16 - 23:17 - 22 ppm

23:17 – 23:18 – 20:00

Poussées de fauteuil roulant

pousse

Toutes les minutes

23:14 - 23:15 : 5 poussées

23:16 - 23:17 : 22 poussées

23:17 - 23:18 : 8 poussées

ActiveCalories brûlées

Calories

Toutes les 15 minutes

23:15 - 23:30 - 2 calories

23:30 - 23:45 - 25 calories

23:45 - 00:00 - 5 calories

TotalCaloriesBrûlées

kcal

Toutes les 15 minutes

23:15 - 23:30 - 16 kcals

23:30 - 23:45 - 16 kcals

23:45 – 00:00 – 16 kcal

Distance

km/min

Toutes les minutes

23:14-23:15 : 0,008 km

23:16 – 23:16 – 0,021 km

23:17 – 23:18 – 0,012 km

Dénivelé positif

m

Toutes les minutes

20:36 - 20:37 - 3,048 min

20:39 – 20:40 – 3,048 min

23:23 - 23:24 - 9,144 min

Étages gravis

étages

Toutes les minutes

23:14 - 23:15 - 5 étages

23:16 - 23:16 - 22 étages

23:17 - 23:18 - 8 étages

Fréquence cardiaque

bpm

Toutes les minutes

06:11 - 55 bpm

Variabilité Fréquence cardiaqueRmssd

ms

Toutes les minutes

6:11 – 23 ms

Fréquence respiratoire

respirations/minute

Toutes les minutes

23:14 - 23:15 : 60 respirations/minute

23:16 - 23:16 : 62 respirations/minute

23:17 - 23:18 : 64 respirations/minute

Saturation en oxygène

%

Toutes les heures

6:11 – 95,208%

Écrire des sessions

Les données doivent être écrites dans Santé Connect à la fin de l'entraînement ou de la session de sommeil.

Il est recommandé d'écrire toute session de sommeil ou d'exercice avec l'appareil d'enregistrement et les métadonnées appropriées, y compris RecordingMethod.

Votre application doit au minimum suivre les instructions de la colonne "attendu" ci-dessous. Dans la mesure du possible, suivez les "meilleures" recommandations.

Données suivies pendant un exercice

Type de données

Unité

Disponibilité

Cordialement,

Exemple

Étapes

pas

Toutes les minutes

Toutes les secondes

23:14-23:15 - 5 pas

23:16 - 23:17 - 22 pas

23:17 - 23:18 - 8 pas

Rythme de pas

pas/min

Toutes les minutes

Toutes les secondes

23:14 – 23:15 – 35 p.m.

23:16 - 23:17 - 37 ppm

23:17 – 23:18 – 40 p.m.

Poussées de fauteuil roulant

pousse

Toutes les minutes

Toutes les secondes

23:14-23:15 - 5 poussées

23:16 - 23:17 : 22 poussées

23:17 - 23:18 : 8 poussées

Cadence de pédalage

rpm

Toutes les minutes

Toutes les secondes

23:14-23:15 – 65 tr/min

23:16 - 23:17 – 70 tr/min

23:17 - 23:18 - 68 tr/min

Puissance

watts

Toutes les minutes

Toutes les secondes

23:14-23:15 - 250 watts

23:16 - 23:17 - 255 watts

23:17 - 23:18 - 245 watts

Vitesse

km/min

Toutes les minutes

Toutes les secondes

23:14-23:15 - 0,3 km/min

23:16 - 23:17 - 0,4 km/min

23:17 - 23:18 -0,4 km/min

Distance

km/m

Toutes les minutes

Toutes les secondes

23:14-23:15 : 0,008 km

23:16 – 23:16 – 0,021 km

23:17 – 23:18 – 0,012 km

ActiveCalories brûlées

kcal

Toutes les minutes

Toutes les secondes

23:14-23:15 : 20 kcal

23:16 - 23:17 - 20 kcals

23:17 - 23:18 - 25 kcals

TotalCaloriesBrûlées

kcal

Toutes les minutes

Toutes les secondes

23:14-23:15 - 36 kcal

23:16 - 23:17 - 36 kcals

23:17 - 23:18 - 41 kcals

Dénivelé positif

m

Toutes les minutes

Toutes les secondes

20:36 - 20:37 - 3,048 min

20:39 – 20:40 – 3,048 min

23:23 - 23:24 - 9,144 min

Parcours sportifs

lat/lng/alt

Toutes les 3 à 5 secondes

Toutes les secondes

Fréquence cardiaque

bpm

Toutes les minutes

Toutes les secondes

23:14-23:15 - 150 bpm

23:16 - 23:17 -152 bpm

23:17 - 23:18 - 155 bpm

Données enregistrées pendant le sommeil

Type de données

Unité

Exemples attendus

Exemple

Phase de sommeil

étape

Période précise par phase de sommeil

23:46 - 23:50 : éveillé

23:50 - 23:56 : sommeil léger

23:56 - 00:16 : sommeil profond

Fréquence cardiaqueau repos

bpm

Valeur quotidienne unique (prévue le premier jour de la matinée)

06:11 - 60 bpm

Saturation en oxygène

%

Valeur quotidienne unique (prévue le premier jour de la matinée)

6:11 – 95,208%