データを同期する

ヘルスコネクトと統合されるアプリのほとんどには、信頼できる情報源として機能する独自のデータストアがあります。ヘルスコネクトは、アプリを同期させる方法を提供します。

アプリに対する要件には次のようなものがあります。

  • 新規データまたは更新データをアプリのデータストアからヘルスコネクトにフィードする。
  • ヘルスコネクトからデータ変更を取得し、アプリのデータストアに反映する。
  • アプリのデータストアでデータが削除された場合、ヘルスコネクトからデータを削除する。

いずれの場合も、同期プロセスではヘルスコネクトとアプリのデータストアの整合性が保たれている必要があります。

ヘルスコネクトにデータをフィードする

同期プロセスの最初の手順は、アプリのデータストアからヘルスコネクト データストアにデータをフィードすることです。

データを準備する

通常、アプリのデータストア内のレコードには、次の詳細情報が含まれます。

  • 一意のキー(UUID など)。
  • バージョンまたはタイムスタンプ。

ヘルスコネクトにフィードされたデータを追跡するようにアプリのデータストアを設計します。これを実現するには、次のロジックを適用します。

  • 変更のリストと、最後のトークンの発行以降に更新があったレコードの取得に使用できるトークンを指定します。
  • エクスポートされたデータが最後に変更された日時を追跡します。

この手順は、新規データまたは更新データのみがヘルスコネクトにフィードされるようにするために不可欠です。

ヘルスコネクトへのデータの書き込み

ヘルスコネクトにデータをフィードする手順は次のとおりです。

  1. アプリのデータストアから新規エントリまたは更新エントリのリストを取得します。
  2. エントリごとに、そのデータ型に適した Record オブジェクトを作成します。たとえば、体重に関するデータには WeightRecord オブジェクトを作成します。
  3. アプリのデータストアから取得できる一意のキーとバージョンの詳細を使用して、Record ごとに Metadata オブジェクトを指定します。データがバージョニングされていない場合は、代わりに現在のタイムスタンプの Long 値を使用できます。

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. insertRecords を使用して、ヘルスコネクトにデータを upsert します。データを upsert すると、clientRecordId 値がヘルスコネクト データストアに存在し、clientRecordVersion が既存の値より大きい場合、ヘルスコネクトの既存のデータが上書きされます。それ以外の場合、upsert されたデータは新しいデータとして書き込まれます。

    healthConnectClient.insertRecords(arrayListOf(record))
    

データのフィードについての実践的な考慮事項については、データの書き込みのベスト プラクティスをご覧ください。

ヘルスコネクト ID を保存する

ヘルスコネクトにレコードを upsert した後、アプリのデータストアでレコードごとにヘルスコネクト id を保存する必要があります。これにより、データを取得した後、受信する各変更で新しいレコードを作成すべきか、あるいは既存のレコードを更新すべきなのかを確認できます。

insertRecords 関数は、id 値のリストを含む InsertRecordsResponse を返します。レスポンスを使用してレコード ID を取得し、保存します。

val response = healthConnectClient.insertRecords(arrayListOf(record))

for (recordId in response.recordIdsList) {
    // Store recordId to your app's datastore
}

ヘルスコネクトからデータを取得する

同期プロセスの手順の 2 番目では、ヘルスコネクトからアプリのデータストアへのデータ変更を取得します。データ変更には、更新と削除が含まれます。

変更トークンを取得する

ヘルスコネクトから取得する変更のリストを取得するには、アプリで変更トークンを追跡する必要があります。これらは、変更をリクエストして、データ変更のリストと、次回使用される変更トークンの両方を返すときに使用できます。

変更トークンを取得するには、getChangesToken を呼び出して、必要なデータ型を指定します。

val changesToken = healthConnectClient.getChangesToken(
    ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)

データ変更の確認

変更トークンを取得すると、そのトークンを使用してすべての変更を取得できます。すべての変更を取得するループを作成し、利用可能なデータ変更があるかどうかを確認することをおすすめします。手順は次のとおりです。

  1. トークンを使用して getChanges を呼び出し、変更のリストを取得します。
  2. 変更の種類が UpsertionChangeDeletionChange かを確認し、必要な操作を行います。
    • 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 については、metadataidlastModifiedTime を使用してレコードを upsert します。DeletionChange については、提供される id を使用してレコードを削除します。

ヘルスコネクトからデータを削除する

ユーザーがアプリから自分のデータを削除するときは、ヘルスコネクトからもそのデータが削除されるようにしてください。そのために、deleteRecords を使用します。これにより、id 値と clientRecordId 値のリストが取得できるので、複数のデータを一括で削除するのに便利です。