Daten synchronisieren

Die meisten Anwendungen, die in Health Connect eingebunden werden können, haben einen eigenen Datenspeicher, der als „Source of Truth“ dient. Health Connect bietet Möglichkeiten zur Synchronisierung deiner App.

Achten Sie darauf, dass Ihre App die folgenden Anforderungen erfüllt:

  • Füttert neue oder aktualisierte Daten aus dem Datenspeicher Ihrer App in Health Connect.
  • Ruft Datenänderungen aus Health Connect ab, die im Datenspeicher Ihrer Anwendung wiedergegeben werden.
  • Löscht Daten aus Health Connect, wenn sie im Datenspeicher Ihrer App gelöscht werden.

Achten Sie in jedem Fall darauf, dass durch den Synchronisierungsprozess sowohl Health Connect als auch der Datenspeicher Ihrer Anwendung aufeinander abgestimmt sind.

Feeddaten für Health Connect

Der erste Teil des Synchronisierungsprozesses besteht darin, Daten aus dem Datenspeicher Ihrer App an den Health Connect-Datenspeicher zu übergeben.

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 nachverfolgt wird, welche Daten bereits an Health Connect eingespeist wurden. Wenden Sie dazu die folgende Logik an:

  • Stellen Sie eine Liste mit Änderungen und ein Token bereit, mit dem Einträge abgerufen werden können, die seit der letzten Ausgabe des Tokens Aktualisierungen enthalten.
  • Verfolgen Sie, wann die exportierten Daten zuletzt geändert wurden.

Diese Schritte sind wichtig, damit nur neue oder aktualisierte Daten an Health Connect gesendet werden.

Daten in Health Connect schreiben

So speisen Sie Daten in Health Connect ein:

  1. Rufen Sie eine Liste neuer oder aktualisierter Einträge aus dem Datenspeicher Ihrer Anwendung ab.
  2. Erstellen Sie für jeden Eintrag ein Record-Objekt entsprechend dem Datentyp. Erstellen Sie beispielsweise ein WeightRecord-Objekt für Daten, die sich auf das Gewicht beziehen.
  3. Geben Sie ein Metadata-Objekt mit jeder Record 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 Wert Long 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 mit insertRecords einen Upsert von Daten in Health Connect aus. Das Upsert von Daten bedeutet, dass alle in Health Connect vorhandenen Daten überschrieben werden, solange die clientRecordId-Werte im Health Connect-Datenspeicher vorhanden sind und der clientRecordVersion-Wert höher als der vorhandene Wert ist. Andernfalls werden die Upsert-Daten als neue Daten geschrieben.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Weitere Informationen zu den praktischen Überlegungen zum Einspeisen von Daten finden Sie unter Daten schreiben.

Health Connect-IDs speichern

Nach dem Upsert Ihrer Einträge in Health Connect muss der Datenspeicher Ihrer Anwendung die Health Connect-id für jeden Eintrag speichern. So kann Ihre Anwendung nach dem Abrufen der Daten prüfen, ob für jede eingehende Änderung ein neuer Eintrag erstellt oder ein vorhandener Eintrag aktualisiert werden muss.

Die Funktion insertRecords gibt ein InsertRecordsResponse-Objekt zurück, das 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 des Synchronisierungsprozesses besteht darin, Datenänderungen aus Health Connect in den Datenspeicher Ihrer Anwendung abzurufen. Die Datenänderungen können Aktualisierungen und Löschungen umfassen.

Änderungstoken abrufen

Damit du eine Liste der Änderungen abrufen kannst, die aus Health Connect abgerufen werden können, muss deine App Changes-Tokens erfassen. Sie können sie verwenden, wenn Sie Changes anfordern, um sowohl eine Liste mit Datenänderungen als auch ein neues Changes-Token zurückzugeben, das beim nächsten Mal verwendet wird.

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 nun ein Changes-Token erhalten haben, können Sie damit alle Changes (Änderungen) abrufen. Wir empfehlen, eine Schleife zu erstellen, um alle Changes zu durchlaufen, in denen geprüft wird, ob Datenänderungen verfügbar sind. Gehen Sie dazu so vor:

  1. Rufen Sie getChanges mit dem Token auf, um eine Liste der Änderungen abzurufen.
  2. Prüfen Sie bei jeder Änderung, ob die Änderungsart UpsertionChange oder DeletionChange ist, 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 Sie keine Daten noch einmal importieren.
  3. Weisen Sie das nächste Changes-Token als neues Token zu.
  4. Wiederholen Sie die Schritte 1 bis 3, bis keine Änderungen mehr übrig 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 Datenabruf finden Sie in den Best Practices für das Synchronisieren von Daten.

Datenänderungen verarbeiten

Zeigen Sie die Änderungen am Datenspeicher Ihrer App an. Verwenden Sie für UpsertionChange den id und den lastModifiedTime aus seinem metadata, um den Eintrag upsert zu erstellen. Verwende für DeletionChange die id, die zum Löschen des Eintrags bereitgestellt wurden.

Daten aus Health Connect löschen

Wenn ein Nutzer seine eigenen Daten aus deiner App löscht, müssen die Daten auch aus Health Connect entfernt werden. Verwenden Sie dazu deleteRecords. Dazu werden ein Eintragstyp und eine Liste von id- und clientRecordId-Werten verwendet, was das Batch-Verfahren zum Löschen mehrerer Daten vereinfacht. Eine alternative deleteRecords, die eine timeRangeFilter annimmt, ist ebenfalls verfügbar.

Best Practices für die Datensynchronisierung

Die folgenden Faktoren beeinflussen den Synchronisierungsprozess.

Ablauf des Tokens

Da ein nicht verwendetes Changes-Token innerhalb von 30 Tagen abläuft, müssen Sie eine Synchronisierungsstrategie verwenden, die den Verlust von Informationen in einem solchen Fall verhindert. Ihre Strategie könnte die folgenden Ansätze umfassen:

  • Suchen Sie im Anwendungsdatenspeicher nach dem zuletzt verwendeten Eintrag, der auch eine id von Health Connect hat.
  • Fordern Sie Einträge aus Health Connect an, die mit einem bestimmten Zeitstempel beginnen, und fügen Sie sie dann in den Datenspeicher Ihrer Anwendung ein oder aktualisieren Sie sie.
  • Fordern Sie ein Änderungstoken an, um es für das nächste Mal bei Bedarf zu reservieren.

Empfohlene Strategien für das Änderungsmanagement

Für den Fall, dass Ihre Anwendung ungültige oder abgelaufene Changes-Tokens erhält, empfehlen wir je nach Anwendung in Ihrer Logik die folgenden Verwaltungsstrategien:

  • Alle Daten lesen und deduplizieren. Das ist die ideale Strategie.
    • Speichert den Zeitstempel des letzten Datenabrufs aus Health Connect.
    • Lesen Sie nach Ablauf des Tokens noch einmal alle Daten des letzten Zeitstempels oder der letzten 30 Tage. Deduplizieren Sie diese dann mithilfe von Kennungen mit den zuvor gelesenen Daten.
    • Idealerweise sollten Sie Client-IDs implementieren, da diese für Datenaktualisierungen erforderlich sind.
  • Nur Daten seit dem Zeitstempel des letzten Lesevorgangs lesen: Dies führt zu einigen Datenabweichungen um den Zeitpunkt des Ablaufs des Änderungstokens. Der Zeitraum ist jedoch kürzer und kann von einigen Stunden bis zu einigen Tagen dauern.
    • Speichert den Zeitstempel des letzten Datenabrufs aus Health Connect.
    • Bei Ablauf des Tokens alle Daten ab diesem Zeitstempel lesen.
  • Daten der letzten 30 Tage löschen und dann lesen. Dies entspricht eher dem, was bei der ersten Integration geschieht.
    • Alle Daten löschen, die die App in den letzten 30 Tagen aus Health Connect gelesen hat
    • Nach dem Löschen kannst du all diese Daten noch einmal lesen.
  • Daten der letzten 30 Tage ohne Deduplizierung lesen. Dies ist die am wenigsten ideale Strategie und führt dazu, dass Nutzern doppelte Daten angezeigt werden.
    • Alle Daten löschen, die die App in den letzten 30 Tagen aus Health Connect gelesen hat
    • Doppelte Einträge zulassen.

Tokens für Datentypänderungen

Wenn Ihre Anwendung mehr als einen Datentyp unabhängig verarbeitet, verwenden Sie für jeden Datentyp separate Änderungstokens. Verwenden Sie mit der Changes Sync API nur dann eine Liste mit mehreren Datentypen, wenn diese Datentypen zusammen oder gar nicht verarbeitet werden.

Lesevorgänge im Vordergrund

Apps können Daten von Health Connect nur dann lesen, wenn sie im Vordergrund ausgeführt werden. Bei der Synchronisierung von Daten aus Health Connect kann der Zugriff auf Health Connect jederzeit unterbrochen werden. Ihre App muss beispielsweise Unterbrechungen während der Synchronisierung verarbeiten, wenn eine große Datenmenge aus Health Connect gelesen wird, und beim nächsten Öffnen der App fortfahren.

Importzeiten

Da Ihre App nicht über neue Daten benachrichtigt werden kann, sollten Sie an zwei Punkten prüfen, ob neue Daten vorliegen:

  • Jedes Mal, wenn deine App im Vordergrund aktiv wird. Verwenden Sie in diesem Fall Lebenszyklusereignisse.
  • In regelmäßigen Abständen, während die App im Vordergrund bleibt. Benachrichtigen Sie Nutzer, wenn neue Daten verfügbar sind, damit sie ihren Bildschirm entsprechend aktualisieren können.