Это руководство совместимо с Health Connect версии 1.1.0-alpha12 .
Большинство приложений, интегрируемых с Health Connect, имеют собственное хранилище данных, служащее источником достоверной информации. Health Connect предоставляет способы синхронизации вашего приложения.
В зависимости от архитектуры вашего приложения процесс синхронизации может включать некоторые или все из следующих действий:
- Передавайте новые или обновленные данные из хранилища данных вашего приложения в Health Connect.
- Переносите изменения данных из Health Connect в хранилище данных вашего приложения.
- Удаляйте данные из Health Connect, если они удалены из хранилища данных вашего приложения.
В каждом случае убедитесь, что процесс синхронизации обеспечивает согласованность данных Health Connect и хранилища данных вашего приложения.
Передача данных в Health Connect
Первая часть процесса синхронизации — передача данных из хранилища данных вашего приложения в хранилище данных Health Connect.
Подготовьте ваши данные
Обычно записи в хранилище данных вашего приложения содержат следующие данные:
- Уникальный ключ, например
UUID
. - Версия или временная метка.
При синхронизации данных с Health Connect идентифицируйте и отправляйте только те данные, которые были вставлены, обновлены или удалены с момента последней синхронизации.
Записать данные в Health Connect
Чтобы загрузить данные в Health Connect, выполните следующие действия:
- Получите список новых, обновленных или удаленных записей из хранилища данных вашего приложения.
- Для каждой записи создайте объект
Record
, соответствующий этому типу данных. Например, создайте объектWeightRecord
для данных, связанных с весом. Укажите объект
Metadata
для каждойRecord
. Он включаетclientRecordId
— идентификатор из хранилища данных вашего приложения, который можно использовать для уникальной идентификации записи. Для этого можно использовать существующий уникальный ключ. Если ваши данные версионированы, укажите такжеclientRecordVersion
, соответствующий версионированию, используемому в ваших данных. Если версионирование не применяется, можно использовать в качестве альтернативы значениеLong
текущей временной метки.val recordVersion = 0L // Specify as needed // The clientRecordId is an ID that you choose for your record. This // is often the same ID you use in your app's datastore. val clientRecordId = "<your-record-id>" val record = WeightRecord( metadata = Metadata.activelyRecorded( clientRecordId = clientRecordId, clientRecordVersion = recordVersion, device = Device(type = Device.TYPE_SCALE) ), weight = Mass.kilograms(62.0), time = Instant.now(), zoneOffset = ZoneOffset.UTC, ) healthConnectClient.insertRecords(listOf()(record))
Вставка данных в Health Connect с помощью
insertRecords
. При обновлении данных все существующие данные в Health Connect будут перезаписаны, если значенияclientRecordId
существуют в хранилище данных Health Connect, а значениеclientRecordVersion
больше существующего. В противном случае вставленные данные будут записаны как новые.healthConnectClient.insertRecords(arrayListOf(record))
Чтобы узнать о практических аспектах ввода данных, ознакомьтесь с рекомендациями по записи данных .
Идентификаторы хранилища Health Connect
Если ваше приложение также считывает данные из Health Connect, сохраняйте id
Health Connect для записей после их обновления и вставки. Этот id
понадобится для обработки удалений при извлечении изменений данных из Health Connect.
Функция insertRecords
возвращает ответ InsertRecordsResponse
, содержащий список значений id
. Используйте ответ для получения идентификаторов записей и их сохранения.
val response = healthConnectClient.insertRecords(arrayListOf(record))
for (recordId in response.recordIdsList) {
// Store recordId to your app's datastore
}
Извлечь данные из Health Connect
Вторая часть процесса синхронизации — это загрузка всех изменений данных из Health Connect в хранилище данных вашего приложения. Изменения данных могут включать обновления и удаления.
Получить токен изменений
Чтобы получить список изменений для извлечения из Health Connect, вашему приложению необходимо отслеживать токены изменений . Вы можете использовать их при запросе изменений , чтобы получить как список изменений данных, так и новый токен изменений для следующего использования.
Чтобы получить токен изменений , вызовите getChangesToken
и укажите необходимые типы данных.
val changesToken = healthConnectClient.getChangesToken(
ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)
Проверить наличие изменений данных
Теперь, когда вы получили токен Changes , используйте его для получения всех Changes . Мы рекомендуем создать цикл для перебора всех Changes , в котором он будет проверять наличие доступных изменений данных. Вот следующие шаги:
- Вызовите
getChanges
используя токен, чтобы получить список изменений . - Проверьте каждое изменение, является ли его типом
UpsertionChange
илиDeletionChange
, и выполните необходимые операции.- Для
UpsertionChange
принимайте только те изменения, которые не поступили из вызывающего приложения, чтобы убедиться, что вы не импортируете данные повторно.
- Для
- Назначьте следующий токен изменений в качестве вашего нового токена.
- Повторяйте шаги 1–3, пока не останется никаких изменений .
- Сохраните следующий токен и зарезервируйте его для будущего импорта.
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
}
Чтобы узнать о практических аспектах извлечения данных, ознакомьтесь с рекомендациями по синхронизации данных .
Изменения данных процесса
Отобразите изменения в хранилище данных вашего приложения. Для UpsertionChange
используйте id
и lastModifiedTime
из metadata
для обновления записи. Для DeletionChange
используйте предоставленный id
для удаления записи. Для этого необходимо сохранить id
записи, как указано в разделе «Идентификаторы Store Health Connect» .
Удалить данные из Health Connect
Когда пользователь удаляет свои данные из вашего приложения, убедитесь, что эти данные также удаляются из Health Connect. Для этого используйте deleteRecords
. Он принимает тип записи и список значений id
и clientRecordId
, что упрощает пакетное удаление нескольких данных. Также доступен альтернативный метод deleteRecords
, принимающий фильтр timeRangeFilter
.
Лучшие практики синхронизации данных
На процесс синхронизации влияют следующие факторы.
Срок действия токена
Поскольку неиспользованный токен Changes истекает через 30 дней, необходимо использовать стратегию синхронизации, которая позволит избежать потери информации в этом случае. Стратегия может включать следующие подходы:
- Найдите в хранилище данных вашего приложения последнюю использованную запись, которая также имеет
id
от Health Connect. - Запросите записи из Health Connect, которые начинаются с определенной временной метки, а затем вставьте или обновите их в хранилище данных вашего приложения.
- Запросите токен изменений, чтобы зарезервировать его на случай, если он понадобится в следующий раз.
Рекомендуемые стратегии управления изменениями
Если ваше приложение получает недействительные или просроченные токены изменений , мы рекомендуем следующие стратегии управления в зависимости от их применения в вашей логике:
- Прочитайте и удалите дубликаты всех данных . Это самая идеальная стратегия.
- Сохранять временную метку последнего считывания данных из Health Connect.
- По истечении срока действия токена перечитайте все данные, начиная с последней временной метки или за последние 30 дней. Затем выполните дедупликацию, используя идентификаторы, сравнив их с ранее считанными данными.
- В идеале следует внедрить идентификаторы клиентов, поскольку они необходимы для обновления данных.
- Чтение данных только с момента последней отметки времени чтения . Это приводит к некоторым расхождениям в данных около времени истечения срока действия токена Changes, но этот период короче и может составлять от нескольких часов до пары дней.
- Сохранять временную метку последнего считывания данных из Health Connect.
- По истечении срока действия токена прочитать все данные, начиная с этой временной метки.
- Удалить, а затем прочитать данные за последние 30 дней . Это более точно соответствует тому, что происходит при первой интеграции.
- Удалить все данные, считанные приложением из Health Connect за последние 30 дней.
- После удаления прочтите все эти данные еще раз.
- Чтение данных за последние 30 дней без дедупликации . Это наименее идеальная стратегия, которая приводит к отображению дублирующихся данных для пользователей.
- Удалить все данные, считанные приложением из Health Connect за последние 30 дней.
- Разрешить дублирование записей.
Тип данных Изменения токенов
Если ваше приложение использует несколько типов данных независимо, используйте отдельные токены изменений для каждого типа данных. Используйте список из нескольких типов данных с API синхронизации изменений только в том случае, если эти типы данных используются вместе или не используются вообще.
Чтения на переднем плане
Приложения могут считывать данные из Health Connect, только находясь в активном режиме. При синхронизации данных из Health Connect доступ к Health Connect может быть прерван в любой момент. Например, ваше приложение должно обрабатывать прерывания синхронизации при считывании большого объёма данных из Health Connect и продолжать работу при следующем открытии приложения.
Фоновые чтения
Вы можете запросить запуск своего приложения в фоновом режиме и чтение данных из Health Connect. Если вы запросите разрешение Background Read
, ваш пользователь сможет предоставить приложению доступ к чтению данных в фоновом режиме.
Сроки импорта
Поскольку ваше приложение не может получать уведомления о новых данных, проверяйте наличие новых данных в двух точках:
- Каждый раз, когда ваше приложение становится активным на переднем плане. В этом случае используйте события жизненного цикла.
- Периодически, пока ваше приложение находится на переднем плане. Уведомляйте пользователей о появлении новых данных, позволяя им обновлять экран в соответствии с изменениями.