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

Это руководство совместимо с 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, выполните следующие действия:

  1. Получите список новых, обновленных или удаленных записей из хранилища данных вашего приложения.
  2. Для каждой записи создайте объект Record , соответствующий этому типу данных. Например, создайте объект WeightRecord для данных, связанных с весом.
  3. Укажите объект 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))
    
    
  4. Вставка данных в 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 , в котором он будет проверять наличие доступных изменений данных. Вот следующие шаги:

  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 для удаления записи. Для этого необходимо сохранить 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 , ваш пользователь сможет предоставить приложению доступ к чтению данных в фоновом режиме.

Сроки импорта

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

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