Большинство приложений, интегрируемых с 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 , ваш пользователь сможет предоставить приложению доступ к чтению данных в фоновом режиме.
Сроки импорта
Поскольку ваше приложение не может получать уведомления о новых данных, проверяйте наличие новых данных в двух точках:
- Каждый раз, когда ваше приложение становится активным на переднем плане. В этом случае используйте события жизненного цикла.
- Периодически, пока ваше приложение находится на переднем плане. Уведомляйте пользователей о появлении новых данных, позволяя им обновлять экран в соответствии с изменениями.