Daten synchronisieren

Die meisten Apps, die in Health Connect eingebunden werden, haben einen eigenen Datenspeicher, der als „Source of Truth“ dient. Health Connect bietet Möglichkeiten, deine App synchron zu halten.

Sorgen Sie dafür, dass Ihre App die folgenden Anforderungen erfüllt:

  • Übergibt neue oder aktualisierte Daten aus dem Datenspeicher Ihrer App in Health Connect.
  • Datenänderungen werden aus Health Connect abgerufen, die im Datenspeicher Ihrer Anwendung widergespiegelt werden.
  • Mit dieser Option werden Daten aus Health Connect gelöscht, wenn sie im Datenspeicher Ihrer App gelöscht werden.

Achten Sie in jedem Fall darauf, dass der Synchronisierungsprozess sowohl für Health Connect als auch für den Datenspeicher Ihrer App aufeinander abgestimmt ist.

Daten in Health Connect speisen

Der erste Teil der Synchronisierung besteht darin, Daten aus dem Datenspeicher Ihrer App in den Health Connect-Datenspeicher einzuspeisen.

Daten vorbereiten

Normalerweise enthalten Datensätze im Datenspeicher Ihrer Anwendung die folgenden Details:

  • Einen eindeutigen Schlüssel, z. B. UUID.
  • Eine Version oder ein Zeitstempel.

Entwerfen Sie den Datenspeicher Ihrer Anwendung so, dass Sie nachverfolgen können, welche Daten bereits in Health Connect eingespeist wurden. Wenden Sie dazu die folgende Logik an:

  • Geben Sie eine Liste der Änderungen und ein Token an, mit dem Einträge abgerufen werden können, die seit der letzten Ausstellung aktualisiert wurden.
  • Verfolgen Sie, wann die exportierten Daten zuletzt geändert wurden.

Diese Schritte sind wichtig, um sicherzustellen, dass nur neue oder aktualisierte Daten in Health Connect eingespeist werden.

Daten in Health Connect schreiben

Führe die folgenden Schritte aus, um Daten in Health Connect einzuspeisen:

  1. Eine Liste neuer oder aktualisierter Einträge aus dem Datenspeicher Ihrer Anwendung abrufen.
  2. Erstellen Sie für jeden Eintrag ein geeignetes Record-Objekt für den jeweiligen Datentyp. Erstellen Sie beispielsweise ein WeightRecord-Objekt für Gewichtsdaten.
  3. Geben Sie für jede Record ein Metadata-Objekt an. Verwenden Sie dazu den eindeutigen Schlüssel und die Versionsdetails aus dem Datenspeicher Ihrer Anwendung. Wenn Ihre Daten nicht versioniert sind, können Sie alternativ den Long-Wert des aktuellen Zeitstempels verwenden.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Führen Sie ein Upsert von Daten mit insertRecords in Health Connect durch. Beim Upsert von Daten werden alle in Health Connect vorhandenen Daten überschrieben, sofern die clientRecordId-Werte im Health Connect-Datenspeicher vorhanden sind und der clientRecordVersion-Wert höher als der vorhandene Wert ist. Andernfalls werden die per Upsert aktualisierten Daten als neue Daten geschrieben.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Weitere Informationen zu den praktischen Überlegungen beim Einspeisen von Daten finden Sie in den Best Practices zum Schreiben von Daten.

Store Health Connect-IDs

Nachdem Sie Ihre Einträge in Health Connect aktualisiert haben, muss der Datenspeicher Ihrer App die Health Connect-id für jeden Datensatz speichern. Dadurch kann Ihre Anwendung prüfen, ob für jede eingehende Änderung ein neuer Eintrag erstellt oder ein vorhandener Eintrag aktualisiert werden muss, nachdem Sie die Daten abgerufen haben.

Die Funktion insertRecords gibt einen InsertRecordsResponse zurück, der die Liste der id-Werte enthält. Verwenden Sie die Antwort, um die Datensatz-IDs abzurufen und zu speichern.

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

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

Daten aus Health Connect abrufen

Der zweite Teil der Synchronisierung besteht darin, alle Datenänderungen von Health Connect in den Datenspeicher Ihrer Anwendung abzurufen. Die Datenänderungen können Aktualisierungen und Löschungen umfassen.

Änderungstoken abrufen

Damit Sie eine Liste der Änderungen abrufen können, die aus Health Connect abgerufen werden können, muss Ihre Anwendung Changes-Tokens verfolgen. Sie können sie verwenden, wenn Sie Changes anfordern, um sowohl eine Liste mit Datenänderungen als auch ein neues Changes-Token für das nächste Mal zurückzugeben.

Um ein Changes-Token zu erhalten, rufen Sie getChangesToken auf und geben Sie die erforderlichen Datentypen an.

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

Auf Datenänderungen prüfen

Nachdem Sie jetzt ein Changes-Token erhalten haben, können Sie damit alle Changes abrufen. Wir empfehlen, eine Schleife zu erstellen, um alle Änderungen zu durchlaufen und zu prüfen, ob Datenänderungen verfügbar sind. Gehen Sie dazu so vor:

  1. Rufen Sie getChanges mit dem Token auf, um eine Liste der Änderungen zu erhalten.
  2. Prüfen Sie bei jeder Änderung, ob es sich um eine UpsertionChange- oder DeletionChange-Änderung handelt, und führen Sie die erforderlichen Vorgänge aus.
    • Nehmen Sie für UpsertionChange nur Änderungen vor, die nicht von der aufrufenden App stammen, damit keine Daten noch einmal importiert werden.
  3. Weisen Sie das nächste Changes-Token als neues Token zu.
  4. Wiederholen Sie die Schritte 1 bis 3, bis keine Änderungen mehr vorhanden sind.
  5. Speichern Sie das nächste Token und reservieren Sie es für einen zukünftigen Import.
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
}

Weitere Informationen zu den praktischen Überlegungen zum Abrufen von Daten finden Sie in den Best Practices zum Synchronisieren von Daten.

Änderungen an Prozessdaten

Nehmen Sie die Änderungen am Datenspeicher Ihrer Anwendung auf. Verwenden Sie für UpsertionChange den id und den lastModifiedTime aus dem metadata, um den Eintrag upsert zu können. Verwenden Sie für DeletionChange den id, um den Eintrag zu löschen.

Daten aus Health Connect löschen

Wenn ein Nutzer seine eigenen Daten aus Ihrer App löscht, achten Sie darauf, dass die Daten auch aus Health Connect entfernt werden. Verwenden Sie dazu deleteRecords. Es wird eine Liste mit id- und clientRecordId-Werten erstellt, die es praktisch macht, mehrere Daten zum Löschen im Batch zu speichern.