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 modi per mantenere sincronizzata la tua app.

Assicurati che la tua app:

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

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

Invia dati a Connessione Salute

La prima parte del processo di sincronizzazione consiste nel fornire i dati del 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 contenenti aggiornamenti dall'emissione dell'ultimo token.
  • Monitora l'ultima volta che 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 quel tipo di dati. 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 hanno il 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. Con l'upsert dei dati, i dati esistenti in Connessione Salute vengono sovrascritti a condizione che i valori clientRecordId siano presenti nel datastore di Connessione Salute 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 di dati nel feed, consulta le best practice per la scrittura di dati.

ID Store Connessione Salute

Dopo aver eseguito l'upsert dei record in Connessione Salute, il datastore della tua app deve archiviare il valore id di Connessione Salute per ogni record. Ciò consente all'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 InsertRecordsResponse contenente 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 i dati da Connessione Salute

La seconda parte del processo di sincronizzazione consiste nell'eseguire il pull di eventuali modifiche ai dati da Connessione Salute al datastore della tua app. Le modifiche ai dati possono includere aggiornamenti ed eliminazioni.

Ottenere 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 Changes per restituire sia un elenco di modifiche ai dati sia un nuovo token Changes da utilizzare la volta successiva.

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

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

Verificare la presenza di modifiche ai dati

Ora che hai ottenuto un token Changes, utilizzalo per ricevere tutte le Changes. Consigliamo di creare un loop per completare tutte le modifiche in cui viene verificato se sono disponibili modifiche ai dati. Ecco la procedura:

  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 le modifiche non provenienti dall'app per le chiamate per assicurarti di non reimportare i dati.
  3. Assegna il token Changes successivo come nuovo token.
  4. Ripeti i passaggi 1-3 finché non sono rimaste 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

Mostra le modifiche al datastore della tua app. Per UpsertionChange, usa id e lastModifiedTime da metadata a upsert del record. Per DeletionChange, utilizza il 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. Usa deleteRecords per farlo. L'operazione richiede un tipo di record e un elenco di valori id e clientRecordId, in modo da semplificare il raggruppamento di più dati per l'eliminazione. È disponibile anche un'deleteRecords alternativa che richiede un timeRangeFilter.