Daten synchronisieren

Die meisten Apps, die mit Health Connect verknüpft sind, haben einen eigenen Datenspeicher, der als „Source of Truth“ dient. Health Connect bietet Möglichkeiten, Ihre App zu synchronisieren.

Ihre App muss Folgendes tun:

  • Überträgt neue oder aktualisierte Daten aus dem Datenspeicher Ihrer App an Health Connect.
  • Hier werden Datenänderungen aus Health Connect abgerufen, die im Datenspeicher Ihrer App berücksichtigt werden.
  • Daten werden aus Health Connect gelöscht, wenn sie im Datenspeicher Ihrer App gelöscht werden.

Achten Sie in jedem Fall darauf, dass bei der Synchronisierung sowohl Health Connect als auch die Datenspeicher Ihrer App übereinstimmen.

Daten an Health Connect senden

Im ersten Teil des Synchronisierungsprozesses werden Daten aus dem Datenspeicher Ihrer App in den Health Connect-Datenspeicher übertragen.

Daten vorbereiten

Normalerweise enthalten Einträge im Datastore Ihrer App die folgenden Details:

  • Ein eindeutiger Schlüssel, z. B. ein UUID.
  • Eine Version oder einen Zeitstempel.

Erstellen Sie den Datenspeicher Ihrer App so, dass Sie im Blick behalten können, welche Daten bereits an Health Connect gesendet wurden. Dazu wenden Sie die folgende Logik an:

  • Geben Sie eine Liste der Änderungen und ein Token an, mit dem Datensätze abgerufen werden können, die seit der Ausgabe des letzten Tokens aktualisiert wurden.
  • Der Zeitpunkt, zu dem 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 geben Sie Daten in Health Connect ein:

  1. Liste der neuen oder aktualisierten Einträge aus dem Datenspeicher Ihrer App abrufen
  2. Erstellen Sie für jeden Eintrag ein Record-Objekt, das für diesen Datentyp geeignet ist. Erstellen Sie beispielsweise ein WeightRecord-Objekt für Daten zum Gewicht.
  3. Geben Sie für jedes Record ein Metadata-Objekt mit dem eindeutigen Schlüssel und den Versionsdetails aus dem Datenspeicher Ihrer App an. 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. Mit insertRecords Daten in Health Connect Upsert Wenn Daten upgedatet werden, werden alle vorhandenen Daten in Health Connect ü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 Upsert-Daten als neue Daten geschrieben.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Informationen zu den praktischen Aspekten der Datenübermittlung finden Sie in den Best Practices für das Schreiben von Daten.

Health Connect-IDs speichern

Nachdem Sie Ihre Datensätze in Health Connect upsertiert haben, muss der Datenspeicher Ihrer App die Health Connect-id für jeden Datensatz speichern. So kann Ihre App prüfen, ob für jede eingehende Änderung ein neuer Datensatz erstellt oder ein vorhandener Datensatz 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. Verwende 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

Im zweiten Teil des Synchronisierungsvorgangs werden alle Datenänderungen von Health Connect in den Datenspeicher Ihrer App abgerufen. Zu den Datenänderungen können Aktualisierungen und Löschungen gehören.

Änderungen-Token abrufen

Damit Ihre App eine Liste der Änderungen abrufen kann, die aus Health Connect abgerufen werden sollen, muss sie Änderungs-Tokens im Blick behalten. Sie können sie verwenden, wenn Sie Änderungen anfordern, um sowohl eine Liste der Datenänderungen als auch ein neues Änderungen-Token zurückzugeben, das beim nächsten Mal verwendet werden soll.

Wenn du ein Änderungen-Token abrufen möchtest, ruf getChangesToken auf und gib die erforderlichen Datentypen an.

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

Nach Datenänderungen suchen

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

  1. Rufe 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 eine 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 Sie keine Daten noch einmal importieren.
  3. Weisen Sie das nächste Änderungen-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
}

Informationen zu den praktischen Aspekten des Abrufens von Daten finden Sie in den Best Practices für die Datensynchronisierung.

Datenänderungen verarbeiten

Nehmen Sie die Änderungen am Datenspeicher Ihrer App vor. Verwenden Sie für UpsertionChange die id und die lastModifiedTime aus dem metadata, um den Eintrag zu Upsert. Verwenden Sie für DeletionChange die bereitgestellte id, um den Eintrag zu löschen.

Daten aus Health Connect löschen

Wenn ein Nutzer seine eigenen Daten aus Ihrer App löscht, müssen diese Daten auch aus Health Connect entfernt werden. Verwenden Sie dazu deleteRecords. Dazu werden ein Datensatztyp und eine Liste von id- und clientRecordId-Werten verwendet. So können mehrere Daten gleichzeitig gelöscht werden. Es ist auch eine alternative deleteRecords verfügbar, die ein timeRangeFilter entgegennimmt.

Best Practices für die Datensynchronisierung

Die folgenden Faktoren wirken sich auf die Synchronisierung aus.

Ablauf des Tokens

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

  • Suchen Sie in Ihrem App-Datenspeicher nach dem zuletzt verwendeten Datensatz, der auch eine id von Health Connect enthält.
  • Sie können Datensätze von Health Connect anfordern, die mit einem bestimmten Zeitstempel beginnen, und sie dann in den Datenspeicher Ihrer App einfügen oder aktualisieren.
  • Fordere ein Änderungstoken an, um es für die nächste Verwendung zu reservieren.

Empfohlene Strategien zur Verwaltung von Änderungen

Wenn Ihre App ungültige oder abgelaufene Änderungen-Tokens erhält, empfehlen wir je nach Anwendung in Ihrer Logik die folgenden Verwaltungsstrategien:

  • Alle Daten lesen und Duplikate entfernen Das ist die ideale Strategie.
    • Speichert den Zeitstempel, zu dem zuletzt Daten aus Health Connect gelesen wurden.
    • Wenn das Token abläuft, werden alle Daten ab dem letzten Zeitstempel oder für die letzten 30 Tage noch einmal gelesen. Anschließend können Sie die Daten mithilfe von IDs mit den zuvor gelesenen Daten abgleichen.
    • Idealerweise sollten Sie Client-IDs implementieren, da sie für Datenaktualisierungen erforderlich sind.
  • Nur Daten seit dem letzten Lesezeitstempel lesen Das führt zu einigen Datenabweichungen um den Zeitpunkt des Ablaufs des Änderungstokens. Der Zeitraum ist jedoch kürzer und kann einige Stunden bis einige Tage dauern.
    • Speichert den Zeitstempel, zu dem zuletzt Daten aus Health Connect gelesen wurden.
    • Nach Ablauf des Tokens werden alle Daten ab diesem Zeitstempel gelesen.
  • Daten der letzten 30 Tage löschen und dann lesen Das entspricht eher dem, was bei der ersten Integration passiert.
    • Alle Daten der letzten 30 Tage, die von der App aus Health Connect gelesen wurden, werden gelöscht.
    • Lesen Sie alle diese Daten noch einmal durch, nachdem Sie sie gelöscht haben.
  • Daten der letzten 30 Tage ohne Deduplizierung lesen Dies ist die am wenigsten geeignete Strategie und führt dazu, dass Nutzern doppelte Daten angezeigt werden.
    • Alle Daten der letzten 30 Tage, die von der App aus Health Connect gelesen wurden, werden gelöscht.
    • Doppelte Einträge zulassen

Tokens für Datentypänderungen

Wenn Ihre App unabhängig voneinander mehrere Datentypen verwendet, verwenden Sie für jeden Datentyp ein separates Änderungstoken. Verwenden Sie eine Liste mit mehreren Datentypen mit der Changes Sync API nur, wenn diese Datentypen entweder zusammen oder gar nicht verwendet werden.

Lesevorgänge im Vordergrund

Apps können Daten nur dann aus Health Connect lesen, wenn sie im Vordergrund sind. Beim Synchronisieren von Daten aus Health Connect kann der Zugriff auf Health Connect jederzeit unterbrochen werden. Ihre App muss beispielsweise Unterbrechungen in der Mitte einer Synchronisierung bewältigen, wenn eine große Menge an Daten aus Health Connect gelesen wird, und beim nächsten Öffnen der App fortfahren.

Lesevorgänge im Hintergrund

Sie können anfordern, dass Ihre Anwendung im Hintergrund ausgeführt wird und Daten aus Health Connect liest. Wenn Sie die Berechtigung Background Read anfordern, kann der Nutzer Ihrer App Zugriff gewähren, um Daten im Hintergrund zu lesen.

Importzeiträume

Da Ihre App nicht über neue Daten benachrichtigt werden kann, sollten Sie an zwei Stellen nach neuen Daten suchen:

  • Jedes Mal, wenn Ihre App im Vordergrund aktiv wird. Verwenden Sie in diesem Fall Lebenszyklusereignisse.
  • Regelmäßig, während Ihre App im Vordergrund ausgeführt wird. Nutzer werden benachrichtigt, wenn neue Daten verfügbar sind, damit sie ihren Bildschirm entsprechend aktualisieren können.