Daten schreiben

In diesem Leitfaden wird das Schreiben oder Aktualisieren von Daten in Health Connect beschrieben.

Datenstruktur einrichten

Bevor wir Daten schreiben können, müssen wir zuerst die Datensätze einrichten. Bei mehr als 50 Datentypen hat jeder eine eigene Struktur. Weitere Informationen zu den verfügbaren Datentypen finden Sie in der Jetpack-Referenz.

Basiseinträge

Der Datentyp Steps in Health Connect erfasst die Anzahl der Schritte, die ein Nutzer zwischen den Messungen gemacht hat. Die Schrittzahl ist ein gängiges Maß für Gesundheits-, Fitness- und Wellness-Plattformen.

Das folgende Beispiel zeigt, wie Daten zur Schrittzahl festgelegt werden:

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Aufzeichnungen mit Maßeinheiten

Health Connect kann Werte zusammen mit ihren Maßeinheiten speichern, um Genauigkeit zu gewährleisten. Ein Beispiel ist der Datentyp Nutrition, der umfangreich und umfassend ist. Sie umfasst eine Vielzahl optionaler Nährstofffelder, die von den gesamten Kohlenhydraten bis hin zu Vitaminen reichen. Jeder Datenpunkt repräsentiert die Nährstoffe, die möglicherweise als Teil einer Mahlzeit oder eines Lebensmittels aufgenommen wurden.

Bei diesem Datentyp werden alle Nährstoffe in Mass-Einheiten dargestellt, energy dagegen in einer Energy-Einheit.

Das folgende Beispiel zeigt, wie die Nährwertdaten für einen Nutzer festgelegt werden, der eine Banane gegessen hat:

val banana = NutritionRecord(
    name = "banana",
    energy = 105.0.kilocalories,
    dietaryFiber = 3.1.grams,
    potassium = 0.422.grams,
    totalCarbohydrate = 27.0.grams,
    totalFat = 0.4.grams,
    saturatedFat = 0.1.grams,
    sodium = 0.001.grams,
    sugar = 14.0.grams,
    vitaminB6 = 0.0005.grams,
    vitaminC = 0.0103.grams,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Aufzeichnungen mit Reihendaten

Health Connect kann eine Liste mit Reihendaten speichern. Ein Beispiel ist der Datentyp Herzfrequenz, mit dem eine Reihe von zwischen den Messungen erkannten Herzschlagproben erfasst wird.

Bei diesem Datentyp wird der Parameter samples durch eine Liste von Herzfrequenzproben dargestellt. Jedes Beispiel enthält einen beatsPerMinute-Wert und einen time-Wert.

Das folgende Beispiel zeigt, wie Daten zu Herzfrequenzreihen eingestellt werden:

val heartRateRecord = HeartRateRecord(
    startTime = START_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endTime = END_TIME,
    endZoneOffset = END_ZONE_OFFSET,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = START_TIME + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    }
)

Daten schreiben

Einer der häufigsten Workflows in Health Connect ist das Schreiben von Daten. Verwenden Sie zum Hinzufügen von Einträgen insertRecords.

Das folgende Beispiel zeigt, wie Sie beim Einfügen von Schrittzahlen Daten schreiben:

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = START_TIME,
            endTime = END_TIME,
            startZoneOffset = START_ZONE_OFFSET,
            endZoneOffset = END_ZONE_OFFSET
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

Daten aktualisieren

Wenn Sie einen oder mehrere Einträge ändern müssen, insbesondere wenn Sie Ihren App-Datenspeicher mit Daten aus Health Connect synchronisieren müssen, können Sie Ihre Daten aktualisieren. Es gibt zwei Möglichkeiten, vorhandene Daten zu aktualisieren, die von der Kennung abhängen, die zum Suchen von Datensätzen verwendet wird.

Metadaten

Es empfiehlt sich, zuerst die Klasse Metadata zu untersuchen, da dies beim Aktualisieren von Daten erforderlich ist. Bei der Erstellung hat jedes Record in Health Connect ein metadata-Feld. Die folgenden Attribute sind für die Synchronisierung relevant:

Properties Beschreibung
id Jeder Record in Health Connect hat einen eindeutigen id-Wert.
In Health Connect wird dieser Wert automatisch eingetragen, wenn ein neuer Eintrag eingefügt wird.
lastModifiedTime Jedes Record erfasst auch, wann der Datensatz zuletzt geändert wurde.
Health Connect füllt dies automatisch aus.
clientRecordId Jeder Record kann eine eindeutige ID zugeordnet sein, die als Referenz in Ihrem App-Datenspeicher dient.
Dieser Wert wird von Ihrer App bereitgestellt.
clientRecordVersion Wenn ein Datensatz clientRecordId hat, kann clientRecordVersion verwendet werden, damit Daten mit der Version in Ihrem App-Datenspeicher synchron bleiben können.
Dieser Wert wird von Ihrer App bereitgestellt.

Über Eintrags-ID aktualisieren

Bereiten Sie zuerst die erforderlichen Datensätze vor, um Daten zu aktualisieren. Nehmen Sie bei Bedarf Änderungen an den Einträgen vor. Rufen Sie dann updateRecords auf, um die Änderungen vorzunehmen.

Das folgende Beispiel zeigt, wie Daten aktualisiert werden. Zu diesem Zweck werden die Zonenversatzwerte für jeden Eintrag in das PST-Format angepasst.

suspend fun updateSteps(
    healthConnectClient: HealthConnectClient,
    prevRecordStartTime: Instant,
    prevRecordEndTime: Instant
) {
    try {
        val request = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(
                    prevRecordStartTime,
                    prevRecordEndTime
                )
            )
        )

        val newStepsRecords = arrayListOf<StepsRecord>()
        for (record in request.records) {
            // Adjusted both offset values to reflect changes
            val sr = StepsRecord(
                count = record.count,
                startTime = record.startTime,
                startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
                endTime = record.endTime,
                endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
                metadata = record.metadata
            )
            newStepsRecords.add(sr)
        }

        client.updateRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

Upsert durch Clientdatensatz-ID

Wenn Sie die optionalen Werte für die Clienteintrags-ID und die Clienteintragsversion verwenden, empfehlen wir die Verwendung von insertRecords anstelle von updateRecords.

Mit der Funktion insertRecords kann ein Upsert von Daten durchgeführt werden. Wenn die Daten, die auf den angegebenen Client-Eintrags-IDs basieren, in Health Connect vorhanden sind, werden sie überschrieben. Andernfalls werden sie als neue Daten geschrieben. Dieses Szenario ist nützlich, wenn Sie Daten aus Ihrem App-Datenspeicher mit Health Connect synchronisieren müssen.

Das folgende Beispiel zeigt, wie ein Upsert für Daten ausgeführt wird, die aus dem App-Datenspeicher abgerufen wurden:

suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        // Assign parameters for this record
        metadata = Metadata(
            clientRecordId = cid
        )
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

suspend fun upsertSteps(
    healthConnectClient: HealthConnectClient,
    newStepsRecords: ArrayList<StepsRecord>
) {
    try {
        healthConnectClient.insertRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

Danach können Sie diese Funktionen in Ihrem Hauptthread aufrufen.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

Wertprüfung in Clientdatensatz-Version

Wenn beim Upsert von Daten die Clientdatensatzversion eingeschlossen ist, führt Health Connect Vergleichsprüfungen in den clientRecordVersion-Werten durch. Wenn die Version aus den eingefügten Daten höher ist als die Version aus den vorhandenen Daten, wird der Upsert-Vorgang ausgeführt. Andernfalls wird die Änderung ignoriert und der Wert bleibt gleich.

Wenn Sie die Versionsverwaltung in Ihre Daten einbeziehen möchten, müssen Sie für Metadata.clientRecordVersion basierend auf Ihrer Versionierungslogik den Wert Long angeben.

val sr = StepsRecord(
    count = count,
    startTime = startTime,
    startZoneOffset = startZoneOffset,
    endTime = endTime,
    endZoneOffset = endZoneOffset,
    metadata = Metadata(
        clientRecordId = cid,
        clientRecordVersion = version
    )
)

Upserts erhöhen version nicht automatisch bei Änderungen. Dadurch werden unerwartete Instanzen des Überschreibens von Daten verhindert. Dafür müssen Sie manuell einen höheren Wert eingeben.

Best Practices

Nachdem Sie die Logik erstellt haben, sollten Sie beim Schreiben oder Aktualisieren von Daten die Best Practices befolgen.