Sincronizza dati

La maggior parte delle app che si integrano con Connessione Salute dispone di un proprio datastore che funge da fonte attendibile. Connessione Salute offre vari modi per tenere sincronizzata la tua app.

Assicurati che la tua app:

  • Invia a Connessione Salute dati nuovi o aggiornati del datastore della tua app.
  • Estrae le modifiche ai dati da Connessione Salute, che si riflettono nel datastore della tua app.
  • Elimina i dati da Connessione Salute quando vengono eliminati nel datastore della tua app.

In ogni caso, assicurati che il processo di sincronizzazione mantenga Connessione Salute e il datastore della tua app allineati.

Invia dati a Connessione Salute

La prima parte del processo di sincronizzazione consiste nel fornire i dati dal datastore della tua app al datastore di Connessione Salute.

Preparare i dati

In genere, i record nel datastore della tua app hanno i seguenti dettagli:

  • Una chiave univoca, ad esempio UUID.
  • Una versione o un timestamp.

Progetta il datastore della tua app per tenere traccia dei dati già inviati a Connessione Salute. A questo scopo, applica la seguente logica:

  • Fornisci un elenco delle modifiche e un token che può essere utilizzato per recuperare i record con aggiornamenti dall'emissione dell'ultimo token.
  • Monitora l'ultima volta in cui i dati esportati sono stati modificati.

Questi passaggi sono essenziali per garantire che solo i dati nuovi o aggiornati vengano inviati a Connessione Salute.

Scrivere dati in Connessione Salute

Per fornire dati a Connessione Salute, svolgi i seguenti passaggi:

  1. Ottieni un elenco di voci nuove o aggiornate dal datastore della tua app.
  2. Per ogni voce, crea un oggetto Record appropriato per il tipo di dati specifico. Ad esempio, crea un oggetto WeightRecord per i dati relativi alla ponderazione.
  3. Specifica un oggetto Metadata con ogni Record utilizzando i dettagli univoci della chiave e della versione dal datastore della tua app. Se i dati non sono sottoposti al controllo delle versioni, puoi utilizzare in alternativa il valore Long del timestamp corrente.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Esegui l'upsert dei dati in Connessione Salute utilizzando insertRecords. L'upserting dei dati significa che tutti i dati esistenti in Connessione Salute vengono sovrascritti, a condizione che nel datastore di Connessione Salute siano presenti i valori clientRecordId e che il valore clientRecordVersion sia maggiore del valore esistente. In caso contrario, i dati sottoposti a upsert vengono scritti come nuovi dati.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Per conoscere le considerazioni pratiche per l'inserimento dei dati nel feed, consulta le best practice per la scrittura di dati.

Archivia ID Connessione Salute

Dopo aver eseguito l'upgrade dei record in Connessione Salute, il datastore della tua app deve archiviare l'elemento id di Connessione Salute per ogni record. Ciò consente alla tua app di verificare se ogni modifica in arrivo richiede la creazione di un nuovo record o l'aggiornamento di un record esistente, dopo il pull dei dati.

La funzione insertRecords restituisce un elemento InsertRecordsResponse che contiene l'elenco di valori di id. Utilizza la risposta per recuperare gli ID record e archiviarli.

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

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

Estrai dati da Connessione Salute

La seconda parte del processo di sincronizzazione consiste nel estrarre eventuali modifiche ai dati da Connessione Salute al datastore della tua app. Le modifiche ai dati possono includere aggiornamenti ed eliminazioni.

Richiedere un token Modifiche

Per ottenere un elenco delle modifiche da estrarre da Connessione Salute, la tua app deve tenere traccia dei token Changes. Puoi utilizzarli quando richiedi Modifiche per restituire sia un elenco di modifiche ai dati sia un nuovo token Modifiche da utilizzare la prossima volta.

Per ottenere un token Changes, chiama getChangesToken e fornisci i tipi di dati richiesti.

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

Verifica la presenza di modifiche ai dati

Ora che hai ottenuto un token Modifiche, utilizzalo per visualizzare tutte le Modifiche. Ti consigliamo di creare un loop per esaminare tutte le Modifiche in cui verifica se sono disponibili modifiche ai dati. Di seguito sono riportati i passaggi da seguire:

  1. Chiama getChanges utilizzando il token per ottenere un elenco di Modifiche.
  2. Controlla ogni modifica se il tipo di modifica è UpsertionChange o DeletionChange ed esegui le operazioni necessarie.
    • Per UpsertionChange, apporta solo modifiche non provenienti dall'app per le chiamate per assicurarti di non reimportare i dati.
  3. Assegna il token Modifiche successivo come nuovo token.
  4. Ripeti i passaggi 1-3 finché non ci sono più modifiche.
  5. Archivia il token successivo e prenotalo per un'importazione futura.
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
}

Per conoscere le considerazioni pratiche per l'estrazione dei dati, consulta le best practice per la sincronizzazione dei dati.

Elabora le modifiche ai dati

Applica le modifiche al datastore della tua app. Per UpsertionChange, utilizza id e lastModifiedTime dal relativo metadata all'upert del record. Per DeletionChange, utilizza il valore id fornito per eliminare il record.

Eliminare i dati da Connessione Salute

Quando un utente elimina i propri dati dalla tua app, assicurati che i dati vengano rimossi anche da Connessione Salute. Per farlo, usa deleteRecords. Viene creato un elenco di valori id e clientRecordId, in modo che sia pratico raggruppare più dati per l'eliminazione.