In diesem Leitfaden wird das Schreiben oder Aktualisieren von Daten in Health Connect beschrieben.
Datenstruktur einrichten
Bevor wir Daten schreiben, müssen wir die Datensätze einrichten. Für mehr als 50 Daten haben alle ihre jeweiligen Strukturen. Weitere Informationen zu den Daten finden Sie in der Jetpack-Referenz. Typen.
Grundlegende Einträge
Mit dem Datentyp Schritte in Health Connect wird die Anzahl der Schritte zwischen den Messungen durchgeführt hat. Schrittzahlen stellen eine gängige Messung dar, auf Plattformen für Gesundheit, Fitness und Wellness.
Das folgende Beispiel zeigt, wie Daten für die Schrittzahl festgelegt werden:
val stepsRecord = StepsRecord(
count = 120,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET
)
Datensätze mit Maßeinheiten
Health Connect kann Werte zusammen mit den zugehörigen Maßeinheiten speichern, um Genauigkeit. Ein Beispiel ist der Datentyp Nutrition, umfangreich. Es umfasst eine Vielzahl optionaler Nährstofffelder mit von Kohlenhydraten bis zu Vitaminen. Jeder Datenpunkt steht für die Nährstoffe die potenziell als Teil einer Mahlzeit oder eines Lebensmittels konsumiert wurden.
In diesem Datentyp werden alle Nährstoffe in Einheiten
Mass
, während energy
durch eine Einheit von Energy
dargestellt wird.
Das folgende Beispiel zeigt, wie Ernährungsdaten für Nutzende mit eine Banane gegessen:
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
)
Datensätze mit Reihendaten
Health Connect kann eine Liste mit Daten zu Buchreihen speichern. Ein Beispiel ist die Datentyp Herzfrequenz, mit dem eine Reihe von Herzschlägen erfasst wird zwischen den Messungen erkannt werden.
In diesem Datentyp wird der Parameter samples
durch eine Liste von
Herzfrequenzproben. Jede Stichprobe enthält ein beatsPerMinute
und einen time
-Wert.
Das folgende Beispiel zeigt, wie Daten zur Herzfrequenzreihe festgelegt 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. So fügen Sie Einträge hinzu:
Verwenden Sie insertRecords
.
Das folgende Beispiel zeigt, wie Daten geschrieben werden, bei denen Schrittzahlen eingefügt werden:
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, Ihren App-Datenspeicher mit Daten aus Health Connect synchronisieren, können Sie Ihre Daten. Es gibt zwei Möglichkeiten, bestehende Daten zu aktualisieren. die zum Auffinden von Datensätzen verwendet wird.
Metadaten
Es lohnt sich, zuerst die Metadata
-Klasse zu untersuchen, da dies erforderlich ist, wenn
Daten zu aktualisieren. Beim Erstellen hat jedes Record
in Health Connect ein
metadata
. Die folgenden Eigenschaften sind relevant für
Synchronisierung:
Properties | Beschreibung |
---|---|
id
|
Jeder Record in Health Connect hat eine eindeutige id
Wert.Health Connect füllt dieses Feld automatisch aus beim Einfügen eines neuen Eintrags. |
lastModifiedTime
|
In jeder Record wird auch erfasst, wann die Funktion
Eintrag wurde geändert.Dies wird von Health Connect automatisch ausgefüllt. |
clientRecordId
|
Jeder Record kann eine eindeutige ID haben, die mit
als Referenz in Ihrem App-Datenspeicher.
Deine App stellt diesen Wert bereit. |
clientRecordVersion
|
Wenn ein Datensatz clientRecordId enthält, wird der
Mit clientRecordVersion können Daten folgende Aktionen ausführen:
mit der Version in Ihrer App synchronisiert werden,
datastore.Deine App stellt diesen Wert bereit. |
Über Datensatz-ID aktualisieren
Bereiten Sie zum Aktualisieren von Daten zuerst die erforderlichen Einträge vor. Nehmen Sie die gewünschten Änderungen an der
bei Bedarf auf. Rufen Sie dann updateRecords
auf, um
die Änderungen vor.
Das folgende Beispiel zeigt, wie Daten aktualisiert werden. Zu diesem Zweck ist jeder Datensatz wird die Zonen-Offset-Werte an PST 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 über Client-Eintrags-ID
Wenn Sie die optionalen Werte „Client-Eintrags-ID“ und „Client-Eintragsversion“ verwenden,
empfehlen wir die Verwendung von insertRecords
anstelle von updateRecords
.
Mit der Funktion insertRecords
kann ein Upsert von Daten ausgeführt werden.
Sind die Daten in Health Connect auf der Grundlage des vorgegebenen
Client-Eintrags-IDs, wird sie überschrieben. Andernfalls werden sie als neue Daten geschrieben.
Dieses Szenario ist nützlich, wenn Sie Daten aus einer der folgenden Quellen synchronisieren müssen:
App-Datenspeicher mit Health Connect verknüpfen.
Das folgende Beispiel zeigt, wie ein Upsert für Daten durchgeführt wird, die aus App-Datenspeicher:
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 im Hauptthread aufrufen.
upsertSteps(healthConnectClient, pullStepsFromDatastore())
Wertprüfung in Client-Eintragsversion
Wenn Ihr Upsert-Prozess für Daten die Client-Eintragsversion, den Zustand
Connect führt Vergleichsprüfungen in der clientRecordVersion
durch
Werte. Wenn die Version aus den eingefügten Daten höher ist als die
aus den vorhandenen Daten wird, wird ein Upsert durchgeführt. Andernfalls wird der Prozess
ignoriert die Änderung und der Wert bleibt gleich.
Um die Versionsverwaltung in Ihre Daten aufzunehmen, müssen Sie
Metadata.clientRecordVersion
mit einem Long
-Wert basierend auf Ihrer Versionsverwaltung
Logik.
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.
und verhindert unerwartetes Überschreiben von Daten. Dabei müssen Sie
manuell einen höheren Wert ein.
Best Practices für das Schreiben von Daten
Apps dürfen nur eigene Daten in Health Connect schreiben.
Wenn Daten in deiner App aus einer anderen App importiert wurden, ob die andere App ihre eigenen Daten in Health Connect schreibt.
Es empfiehlt sich auch, eine Logik zu implementieren, die Schreibausnahmen verarbeitet, z. B. oder ein interner Systemfehler vorliegt. Sie können Ihre Backoff- und Wiederholungsstrategien in einem Jobplanungsmechanismus. Wenn Sie an eine Health Connect ist letztendlich nicht erfolgreich – achte darauf, dass deine App an diesem Punkt des Exports. Vergessen Sie nicht, Fehler zu protokollieren und zu melden, um eine Diagnose zu ermöglichen.
Beim Erfassen von Daten gibt es einige Vorschläge, je nachdem, wie Ihre App Daten schreibt.
Passives Tracking
Dazu gehören Apps, die ein passives Fitness- oder Gesundheits-Tracking durchführen, Aufzeichnung von Schritten oder Herzfrequenz kontinuierlich im Hintergrund.
Ihre App muss regelmäßig Daten in Health Connect schreiben. auf folgende Arten:
- Bei jeder Synchronisierung nur neue Daten und aktualisierte Daten schreiben, die seit bei der letzten Synchronisierung.
- Chunk-Anfragen für maximal 1.000 Datensätze pro Schreibanfrage.
- Mit
WorkManager
können Sie regelmäßige Hintergrundaufgaben planen, mit für einen Zeitraum von mindestens 15 Minuten. Aufgaben so einschränken, dass sie nur ausgeführt werden, wenn das Gerät inaktiv ist und keine niedrigen Auslastung Akku.
val constraints = Constraints.Builder() .requiresBatteryNotLow() .requiresDeviceIdle(true) .build() val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>( 15, TimeUnit.MINUTES, 5, TimeUnit.MINUTES ) .setConstraints(constraints) .build()
Aktives Tracking
Dazu gehören Apps mit ereignisbasiertem Tracking, wie z. B. Training und Schlaf, oder manuelle Benutzereingaben wie Ernährung. Diese Einträge werden erstellt, wenn die App im Vordergrund ausgeführt wird oder in seltenen Fällen, wenn sie mehrmals am Tag verwendet wird.
Achten Sie darauf, dass Ihre App Health Connect nicht für die gesamte Dauer ausgeführt wird Dauer des Ereignisses.
Es gibt zwei Möglichkeiten, Daten in Health Connect zu schreiben:
- Nach Abschluss der Veranstaltung kannst du die Daten mit Health Connect synchronisieren. Beispiel: Synchronisierung wenn der Nutzer eine aufgezeichnete Trainingssitzung beendet.
- Einmalige Aufgabe mit
WorkManager
zur Datensynchronisierung planen .
Best Practices für Granularität und Häufigkeit von Schreibvorgängen
Verwenden Sie beim Schreiben von Daten in Health Connect die entsprechende Auflösung. Mit der angemessene Auflösung trägt dazu bei, die Speicherauslastung zu reduzieren, konsistente und präzise Daten zu erhalten. Die Datenauflösung umfasst zwei Dinge:
- Häufigkeit der Schreibvorgänge: Wie oft Ihre Anwendung neue Daten in einen Health Connect Schreiben Sie beispielsweise alle 15 Minuten neue Daten.
- Detaillierungsgrad der geschriebenen Daten: wie oft die gesendeten Daten übertragen wurden. Stichproben. Schreiben Sie beispielsweise alle 5 s Herzfrequenzproben. Nicht jeder Datentyp erfordert dieselbe Abtastrate. Die Aktualisierung der Schrittzahl bringt wenig Vorteile im Gegensatz zu einer selteneren Kadenz wie etwa alle 60 Sekunden. Bei höheren Stichprobenraten erhalten die Nutzenden jedoch Gesundheits- und Fitnessdaten genauer ansehen. Abtastratenfrequenzen ein ausgewogenes Verhältnis zwischen Detail und Leistung zu finden.
Daten schreiben, die über den Tag hinweg überwacht werden
Für fortlaufend erhobene Daten, wie z. B. Schritte, sollte Ihre Anwendung im Laufe des Tages mindestens alle 15 Minuten an Health Connect schreiben.
Datentyp |
Einheit |
Voraussichtliches |
Beispiel |
Schritte |
Schritte |
Jede Minute |
23:14–23:15 – 5 Schritte 23:16–23:17 – 22 Schritte 23:17–23:18 – 8 Schritte |
Schrittfrequenz |
Schritte/min |
Jede Minute |
23:14–23:15 – 5 SPM 23:16–23:17 – 22 SPM 23:17–23:18 – 8 SPM |
Rollstuhlanschübe |
Pushes |
Jede Minute |
23:14–23:15 – 5 Pushes 23:16–23:17 – 22 Pushes 23:17–23:18 – 8 Pushes |
Verbrannte Kalorien |
Kalorien |
Alle 15 Minuten |
23:15–23:30 – 2 Kalorien 23:30–23:45 – 25 Kalorien 23:45 – 00:00 – 5 Kalorien |
Verbrannte Kalorien insgesamt |
Kalorien |
Alle 15 Minuten |
23:15–23:30 – 16 Kalorien 23:30–23:45 – 16 Kalorien 23:45 - 00:00 - 16 Kalorien |
Strecke |
km/min |
Jede Minute |
23:14–23:15 – 0,008 km 23:16–23:16 – 0,021 km 23:17–23:18 – 0,012 km |
Bewältigte Steigung |
m |
Jede Minute |
20:36–20:37–3,048 m 20:39–20:40–3,048 m 23:23–23:24 – 9,144 m |
Etagen |
Stockwerke |
Jede Minute |
23:14–23:15 – 5 Etagen 23:16–23:16 – 22 Etagen 23:17–23:18 – 8 Etagen |
Herzfrequenz |
bpm |
Jede Minute |
6:11 – 55 SPM |
HeartRateVariabilityRmssd |
ms |
Jede Minute |
6:11–23 ms |
Atemfrequenz |
Atemzüge/Minute |
Jede Minute |
23:14–23:15 – 60 Atemzüge/Minute 23:16–23:16 – 62 Atemzüge/Minute 23:17–23:18 – 64 Atemzüge/Minute |
Sauerstoffsättigung |
% |
Stündlich |
6:11 – 95,208% |
Schreibsitzungen
Die Daten sollten am Ende des Trainings oder Schlafs in Health Connect geschrieben werden. Sitzung.
Als Best Practice sollten Schlaf- und Trainingseinheiten mit
das Aufzeichnungsgerät und die entsprechenden Metadaten,
RecordingMethod
Ihre Anwendung sollte mindestens den Anweisungen in den „erwarteten“ Spalte unten. Wo? sollten Sie die "besten" Anleitung.
Daten, die während eines Trainings aufgezeichnet werden
Datentyp |
Einheit |
Voraussichtliches |
Viele Grüße |
Beispiel |
Schritte |
Schritte |
Jede Minute |
Jede Sekunde |
23:14-23:15 – 5 Schritte 23:16–23:17 – 22 Schritte 23:17–23:18 – 8 Schritte |
Schrittfrequenz |
Schritte/min |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 35 SPM 23:16–23:17–37 SPM 23:17–23:18 – 40 SPM |
Rollstuhlanschübe |
Pushes |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 5 Pushes 23:16–23:17 – 22 Pushes 23:17–23:18 – 8 Pushes |
Radfahren/Radfahren |
AZ/min |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 65 U/min 23:16–23:17 – 70 U/min 23:17–23:18 – 68 U/min |
Stromversorgung |
Watt |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 250 Watt 23:16–23:17 – 255 Watt 23:17–23:18 – 245 Watt |
Geschwindigkeit |
km/min |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 0,3 km/min 23:16–23:17 – 0,4 km/min 23:17–23:18 –0,4 km/min |
Strecke |
km/m |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 0,008 km 23:16–23:16 – 0,021 km 23:17–23:18 – 0,012 km |
Verbrannte Kalorien |
Kalorien |
Jede Minute |
Jede Sekunde |
23:14-23:15 - 20 Kalorien 23:16–23:17 – 20 Kalorien 23:17–23:18 – 25 Kalorien |
Verbrannte Kalorien insgesamt |
Kalorien |
Jede Minute |
Jede Sekunde |
23:14-23:15 - 36 Kalorien 23:16–23:17 – 36 Kalorien 23:17–23:18 – 41 Kalorien |
Gewonnene Höhe |
m |
Jede Minute |
Jede Sekunde |
20:36–20:37–3,048 m 20:39–20:40–3,048 m 23:23–23:24 – 9,144 m |
Trainingsrouten |
Breiten- und Längengrad/Alt |
Alle 3–5 Sekunden |
Jede Sekunde |
|
Herzfrequenz |
bpm |
Jede Minute |
Jede Sekunde |
23:14–23:15 – 150 SPM 23:16–23:17 –152 SPM 23:17–23:18 – 155 SPM |
Daten, die während des Schlafs aufgezeichnet werden
Datentyp |
Einheit |
Erwartete Beispiele |
Beispiel |
Schlafphasen |
Phase |
Detaillierter Zeitraum pro Schlafphase |
23:46–23:50 – wach 23:50–23:56 – leichter Schlaf 23:56–00:16 – Tiefschlaf |
Ruheherzfrequenz |
bpm |
Einzelner Tageswert (erwartet als Erstes am Morgen) |
6:11 – 60 SPM |
Sauerstoffsättigung |
% |
Einzelner Tageswert (erwartet als Erstes am Morgen) |
6:11 – 95,208% |