Синхронизировать данные

Большинство приложений, интегрируемых с Health Connect, имеют собственное хранилище данных, которое служит источником достоверной информации. Health Connect предоставляет способы синхронизировать ваше приложение.

Убедитесь, что ваше приложение выполняет следующие действия:

  • Передает новые или обновленные данные из хранилища данных вашего приложения в Health Connect.
  • Извлекает изменения данных из Health Connect, которые отражаются в хранилище данных вашего приложения.
  • Удаляет данные из Health Connect при их удалении из хранилища данных вашего приложения.

В каждом случае убедитесь, что процесс синхронизации обеспечивает согласованность Health Connect и хранилища данных вашего приложения.

Передача данных в Health Connect

Первая часть процесса синхронизации — передача данных из хранилища данных вашего приложения в хранилище данных Health Connect.

Подготовьте свои данные

Обычно записи в хранилище данных вашего приложения содержат следующие сведения:

  • Уникальный ключ, например UUID .
  • Версия или временная метка.

Создайте хранилище данных вашего приложения, чтобы отслеживать, какие данные уже переданы в Health Connect. Для этого примените следующую логику:

  • Предоставьте список изменений и токен, который можно использовать для получения записей, имеющих обновления с момента выдачи последнего токена.
  • Отслеживайте последний раз, когда экспортированные данные были изменены.

Эти шаги необходимы для обеспечения передачи в Health Connect только новых или обновленных данных.

Запись данных в Health Connect

Чтобы передать данные в Health Connect, выполните следующие действия:

  1. Получите список новых или обновленных записей из хранилища данных вашего приложения.
  2. Для каждой записи создайте объект Record , соответствующий этому типу данных. Например, создайте объект WeightRecord для данных, связанных с весом.
  3. Укажите объект Metadata для каждой Record используя уникальный ключ и сведения о версии из хранилища данных вашего приложения. Если ваши данные не версионированы, в качестве альтернативы вы можете использовать значение Long текущей метки времени.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Отправьте данные в Health Connect с помощью insertRecords . Обновление данных означает, что любые существующие данные в Health Connect перезаписываются, пока значения clientRecordId существуют в хранилище данных Health Connect, а значение clientRecordVersion превышает существующее значение. В противном случае вставленные данные записываются как новые данные.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Чтобы узнать о практических соображениях по загрузке данных, ознакомьтесь с рекомендациями по записи данных .

Идентификаторы Store Health Connect

После добавления ваших записей в 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))
)

Проверьте изменения данных

Теперь, когда вы получили жетон Изменения , используйте его, чтобы получить все Изменения . Мы рекомендуем создать цикл для прохождения всех изменений , в котором он проверяет наличие доступных изменений данных. Вот следующие шаги:

  1. Вызовите getChanges используя токен, чтобы получить список изменений .
  2. Проверьте каждое изменение, является ли его тип изменения UpsertionChange или DeletionChange , и выполните необходимые операции.
    • Для UpsertionChange вносите только те изменения, которые не были получены из вызывающего приложения, чтобы убедиться, что вы не импортируете данные повторно.
  3. Назначьте следующий токен изменений в качестве нового токена.
  4. Повторяйте шаги 1–3, пока не останется изменений .
  5. Сохраните следующий токен и зарезервируйте его для будущего импорта.
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 для удаления записи.

Удаление данных из Health Connect

Когда пользователь удаляет свои данные из вашего приложения, убедитесь, что данные также удаляются из Health Connect. Для этого используйте deleteRecords . Для этого требуется тип записи и список значений id и clientRecordId , что позволяет удобно группировать несколько данных для удаления. Также доступен альтернативный deleteRecords , который принимает timeRangeFilter .

Рекомендации по синхронизации данных

Следующие факторы влияют на процесс синхронизации.

Срок действия токена

Поскольку срок действия неиспользованного токена изменений истекает в течение 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 и продолжать работу при следующем открытии приложения.

Тайминги импорта

Поскольку ваше приложение не может получать уведомления о новых данных, проверьте наличие новых данных в двух точках:

  • Каждый раз, когда ваше приложение становится активным на переднем плане. В этом случае используйте события жизненного цикла.
  • Периодически, пока ваше приложение остается на переднем плане. Уведомляйте пользователей о появлении новых данных, позволяя им обновлять экран, чтобы отразить изменения.