Questa guida illustra il processo di scrittura o aggiornamento dei dati in Connessione Salute.
Configura la struttura dei dati
Prima di scrivere i dati, dobbiamo configurare i record. Per più di 50 dati tipo, ognuno con le proprie strutture. Consulta la documentazione di riferimento di Jetpack per ulteriori dettagli sui dati tipi disponibili.
Record di base
Il tipo di dati Passi in Connessione Salute registra il numero di passi che un l'utente tra una lettura e l'altra. Il numero di passi rappresenta una misurazione comune su piattaforme di salute, fitness e benessere.
L'esempio seguente mostra come impostare i dati per il conteggio dei passi:
val stepsRecord = StepsRecord(
count = 120,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET
)
Registrazione con unità di misura
Connessione Salute può archiviare i valori insieme alle relative unità di misura per fornire la precisione. Un esempio è il tipo di dati Alimentazione che è vasto e esaustive. Include una vasta gamma di campi nutritivi facoltativi, dai carboidrati totali alle vitamine. Ogni punto dati rappresenta le sostanze nutritive potenzialmente consumati come parte di un pasto o di un alimento.
In questo tipo di dati, tutti i nutrienti sono rappresentati in unità di
Mass
, mentre energy
è rappresentato in un'unità di Energy
.
L'esempio seguente mostra come impostare i dati nutrizionali per un utente che ha mangiato una banana:
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
)
Record con dati della serie
Connessione Salute può archiviare un elenco di dati delle serie. Un esempio è la Tipo di dati Battito cardiaco che acquisisce una serie di campioni di battito cardiaco rilevato tra una lettura e l'altra.
In questo tipo di dati, il parametro samples
è rappresentato da un elenco di
Campioni di battito cardiaco. Ogni campione contiene un valore beatsPerMinute
e un valore time
.
L'esempio seguente mostra come impostare i dati delle serie del battito cardiaco:
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(),
)
}
)
Scrittura di dati
Uno dei flussi di lavoro comuni in Connessione Salute è la scrittura di dati. Per aggiungere record,
utilizza insertRecords
.
L'esempio seguente mostra come scrivere i conteggi di passaggi per l'inserimento di dati:
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
}
}
Aggiorna dati
Se hai bisogno di modificare uno o più record, soprattutto sincronizza il datastore dell'app con i dati di Connessione Salute, puoi aggiornare i tuoi dati. Esistono due modi per aggiornare i dati esistenti, che dipendono identificatore utilizzato per trovare i record.
Metadati
Ti consigliamo di esaminare prima il corso Metadata
in quanto è necessario quando
aggiornare i dati. Al momento della creazione, ogni Record
in Connessione Salute ha un
metadata
. Le seguenti proprietà sono pertinenti per
dell'audiodescrizione:
Proprietà | Descrizione |
---|---|
id
|
Ogni Record in Connessione Salute ha un id univoco
valore.Connessione Salute compila automaticamente quando inserisci un nuovo record. |
lastModifiedTime
|
Ogni Record tiene traccia anche dell'ultima volta
è stato modificato.Connessione Salute compila automaticamente questo campo. |
clientRecordId
|
A ogni Record può essere associato un ID univoco
da usare come riferimento nel datastore delle app.
La tua app fornisce questo valore. |
clientRecordVersion
|
Se un record ha clientRecordId ,
È possibile usare clientRecordVersion per consentire ai dati di
rimangono sincronizzati con la versione dell'app
datastore.La tua app fornisce questo valore. |
Aggiorna tramite Record ID
Per aggiornare i dati, prepara prima i record necessari. Apporta eventuali modifiche
record, se necessario. Quindi, chiama updateRecords
per effettuare
le modifiche.
L'esempio seguente mostra come aggiornare i dati. A questo scopo, ogni record i valori di offset di zona vengono regolati in 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
}
}
Esegui upsert tramite ID record client
Se utilizzi i valori facoltativi ID record client e Versione record client,
consigliamo di utilizzare insertRecords
anziché updateRecords
.
La funzione insertRecords
è in grado di eseguire l'upsert dei dati.
Se i dati esistono in Connessione Salute in base all'insieme di dati specificato
con gli ID record client, vengono sovrascritti. In caso contrario, vengono scritti come nuovi dati.
Questo scenario è utile ogni volta che devi sincronizzare i dati da
del tuo datastore dell'app a Connessione Salute.
L'esempio seguente mostra come eseguire un upsert sui dati estratti il datastore dell'app:
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
}
}
Dopodiché, puoi chiamare queste funzioni nel thread principale.
upsertSteps(healthConnectClient, pullStepsFromDatastore())
Controllo del valore nella versione del record client
Se il processo di upserting dei dati include la versione del record del client, Health
Connect esegue controlli di confronto in clientRecordVersion
e i relativi valori. Se la versione dei dati inseriti è superiore a
ai dati esistenti, viene eseguito l'upsert. In caso contrario, la procedura
ignora la modifica e il valore rimane lo stesso.
Per includere il controllo delle versioni nei dati, devi fornire
Metadata.clientRecordVersion
con un valore Long
basato sul controllo delle versioni
logica.
val sr = StepsRecord(
count = count,
startTime = startTime,
startZoneOffset = startZoneOffset,
endTime = endTime,
endZoneOffset = endZoneOffset,
metadata = Metadata(
clientRecordId = cid,
clientRecordVersion = version
)
)
Gli upsert non aumentano automaticamente di version
in caso di modifiche,
per evitare istanze impreviste di sovrascrittura dei dati. Detto ciò,
assegnale manualmente un valore più alto.
Best practice per la scrittura dei dati
Le app devono scrivere in Connessione Salute solo dati provenienti dalla tua proprietà.
Se i dati nella tua app sono stati importati da un'altra app, la responsabilità ricade sull'altra app per scrivere i propri dati in Connessione Salute.
È inoltre consigliabile implementare una logica che gestisca le eccezioni di scrittura come i dati non rientrano nei limiti o si tratta di un errore di sistema interno. Puoi applicare strategie di backoff e di ripetizione di un job su un meccanismo di pianificazione dei job. Se scrivi a Connessione Salute non riesce. Assicurati che la tua app possa andare oltre quel punto di esportazione. Non dimenticare di registrare e segnalare gli errori per facilitare la diagnosi.
Ecco un paio di suggerimenti utili per il monitoraggio dei dati da seguire a seconda del modo in cui l'app scrive i dati.
Monitoraggio passivo
Sono incluse le app che eseguono il monitoraggio passivo o di salute dell'attività, come registrando passi o battito cardiaco in background.
La tua app deve scrivere periodicamente i dati in Connessione Salute nel nei seguenti modi:
- A ogni sincronizzazione, scrivi solo i nuovi dati e quelli aggiornati che sono stati modificati dal giorno durante l'ultima sincronizzazione.
- Richieste di chunk a un massimo di 1000 record per richiesta di scrittura.
- Utilizza
WorkManager
per pianificare attività periodiche in background, con per un periodo di almeno 15 minuti. Limita l'esecuzione delle attività solo quando il dispositivo è inattivo e non è in esaurimento batteria.
val constraints = Constraints.Builder() .requiresBatteryNotLow() .requiresDeviceIdle(true) .build() val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>( 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES ) .setConstraints(constraints) .build()
Monitoraggio attivo
Sono incluse le app che eseguono il monitoraggio basato sugli eventi come l'allenamento e il sonno, o input manuali dell'utente come l'alimentazione. Questi record vengono creati quando l'app è in primo piano o in rari eventi quando viene utilizzato più volte in un giorno.
Assicurati che la tua app non mantenga Connessione Salute per l'intera durata durata dell'evento.
I dati devono essere scritti in Connessione Salute in uno dei due modi seguenti:
- Sincronizza i dati in Connessione Salute al termine dell'evento. Ad esempio, sincronizza dati quando l'utente termina una sessione di allenamento rilevata.
- Pianificare un'attività una tantum utilizzando
WorkManager
per sincronizzare i dati in un secondo momento.
Best practice per granularità e frequenza delle scritture
Quando scrivi dati in Connessione Salute, usa la risoluzione appropriata. L'utilizzo del una risoluzione adeguata aiuta a ridurre il carico di archiviazione, mantenendo al contempo coerenti e accurati. La risoluzione dei dati include due aspetti:
- Frequenza di scritture: la frequenza con cui l'applicazione esegue il push dei nuovi dati in Connessione Salute. Ad esempio, scrivi nuovi dati ogni 15 minuti.
- Granularità dei dati scritti: la frequenza con cui i dati inviati sono stati campionato. Ad esempio, scrivi campioni del battito cardiaco ogni 5 secondi. Non tutti i tipi di dati richiede la stessa frequenza di campionamento. L'aggiornamento del conteggio dei passi presenta un vantaggio minimo ogni secondo, al contrario di una cadenza meno frequente come secondi. Tuttavia, frequenze di campionamento più elevate possono offrire agli utenti una cronologia esaminare in modo dettagliato i propri dati relativi a salute e fitness. Frequenze di frequenza di campionamento devono trovare un equilibrio tra dettaglio e rendimento.
Scrivere dati monitorati durante il giorno
Per i dati raccolti regolarmente, come i passaggi, la tua applicazione deve scrivere a Connessione Salute almeno ogni 15 minuti durante la giornata.
Tipo di dati |
Unità |
Prevista |
Esempio |
Passi |
passi |
Ogni minuto |
23:14 - 23:15 - 5 passi 23:16 - 23:17 - 22 passi 23:17 - 23:18 - 8 passi |
Cadenza dei passi |
passi/min |
Ogni minuto |
23:14 - 23:15 - 17:00 23:16 - 23:17 - 22 spm 23:17 - 23:18 - 20:00 |
Spinte in sedia a rotelle |
push |
Ogni minuto |
23:14 - 23:15 - 5 spinte 23:16 - 23:17 - 22 spinte 23:17 - 23:18 - 8 spinte |
Calorie bruciate in fase di attività |
Calorie |
Ogni 15 minuti |
23:15 - 23:30 - 2 Calorie 23:30 - 23:45 - 25 Calorie 23:45 - 00:00 - 5 Calorie |
TotaleCalorieBrute |
Calorie |
Ogni 15 minuti |
23:15 - 23:30 - 16 Calorie 23:30 - 23:45 - 16 Calorie 23:45 - 00:00 - 16 Calorie |
Distanza |
km/min |
Ogni minuto |
23:14-23:15 - 0.008 km 23:16 - 23:16 - 0.021 km 23:17 - 23:18 - 0.012 km |
Dislivello |
m |
Ogni minuto |
20:36 - 20:37 - 3,048 m 20:39 - 20:40 - 3,048 m 23:23 - 23:24 - 9,144 m |
Piani saliti |
piani |
Ogni minuto |
23:14 - 23:15 - 5 piani 23:16 - 23:16 - 22 piani 23:17 - 23:18 - 8 piani |
Battito cardiaco |
bpm |
Ogni minuto |
6:11 - 55 b/m |
Variabilità della frequenza cardiaca (HRmssd) |
ms |
Ogni minuto |
6:11 - 23 ms |
Frequenza respiratoria |
respiri/minuto |
Ogni minuto |
23:14 - 23:15 - 60 respiri/minuto 23:16 - 23:16 - 62 respiri/minuto 23:17 - 23:18 - 64 respiri/minuto |
Saturazione ossigeno |
% |
Ogni ora |
6:11 - 95,208% |
Scrittura delle sessioni
I dati devono essere scritti in Connessione Salute alla fine dell'esercizio o del sonno durante la sessione.
Come best practice, qualsiasi sessione di sonno o allenamento deve essere scritta con
il dispositivo di registrazione e i metadati appropriati, tra cui
RecordingMethod
.
Come minimo, la tua richiesta deve seguire le indicazioni della sezione colonna sottostante. Dove possibili, segui le "migliori" guida.
Dati rilevati durante un allenamento
Tipo di dati |
Unità |
Prevista |
Cordiali saluti, |
Esempio |
Passi |
passi |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 5 passi 23:16 - 23:17 - 22 passi 23:17 - 23:18 - 8 passi |
Cadenza dei passi |
passi/min |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 35 spm 23:16 - 23:17 - 37 spm 23:17 - 23:18 - 40 spm |
Spinte in sedia a rotelle |
push |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 5 spinte 23:16 - 23:17 - 22 spinte 23:17 - 23:18 - 8 spinte |
CiclismoPedalingCadence |
rpm / respiri al minuto |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 65 giri/min 23:16 - 23:17 - 70 giri/min 23:17 - 23:18 - 68 giri/min |
Potenza |
watt |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 250 watt 23:16 - 23:17 - 255 watt 23:17 - 23:18 - 245 watt |
Velocità |
km/min |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 0.3 km/min 23:16 - 23:17 - 0.4 km/min 23:17 - 23:18 -0,4 km/min |
Distanza |
km/m |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 0.008 km 23:16 - 23:16 - 0.021 km 23:17 - 23:18 - 0.012 km |
Calorie bruciate in fase di attività |
Calorie |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 20 Calorie 23:16 - 23:17 - 20 Calorie 23:17 - 23:18 - 25 Calorie |
TotaleCalorieBrute |
Calorie |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 36 Calorie 23:16 - 23:17 - 36 Calorie 23:17 - 23:18 - 41 Calorie |
Dislivello |
m |
Ogni minuto |
Ogni secondo |
20:36 - 20:37 - 3,048 m 20:39 - 20:40 - 3,048 m 23:23 - 23:24 - 9,144 m |
Percorsi allenamento |
lat/lng/alt |
Ogni 3-5 secondi |
Ogni secondo |
|
Battito cardiaco |
bpm |
Ogni minuto |
Ogni secondo |
23:14-23:15 - 150 b/m 23:16 - 23:17 -152 bpm 23:17 - 23:18 - 155 bpm |
Dati rilevati durante il sonno
Tipo di dati |
Unità |
Campioni previsti |
Esempio |
Preparazione del sonno |
fase |
Periodo di tempo granulare per fase del sonno |
23:46 - 23:50 - sveglio 23:50 - 23:56 - sonno leggero 23:56 - 00:16 - sonno profondo |
Battito cardiaco a riposo |
bpm |
Singolo valore giornaliero (previsto come prima cosa al mattino) |
06:11 - 60 b/m |
Saturazione ossigeno |
% |
Singolo valore giornaliero (previsto come prima cosa al mattino) |
6:11 - 95,208% |