Đồng bộ hoá dữ liệu

Hầu hết ứng dụng tích hợp với Health Connect đều có kho dữ liệu riêng đóng vai trò là nguồn tập trung và đáng tin cậy. Health Connect cung cấp nhiều cách để bạn giữ cho ứng dụng của mình luôn đồng bộ.

Hãy đảm bảo ứng dụng của bạn thực hiện những việc sau:

  • Cấp dữ liệu mới hoặc dữ liệu được cập nhật từ kho dữ liệu của ứng dụng lên Health Connect.
  • Lấy các thay đổi về dữ liệu (phản ánh trong kho dữ liệu của ứng dụng) từ Health Connect.
  • Xoá dữ liệu khỏi Health Connect khi dữ liệu đó bị xoá trong kho dữ liệu của ứng dụng.

Trong mỗi trường hợp, hãy đảm bảo rằng quy trình đồng bộ hoá diễn ra thống nhất cho cả Health Connect và kho dữ liệu của ứng dụng.

Cấp dữ liệu cho Health Connect

Giai đoạn đầu tiên của quá trình đồng bộ hoá là chuyển dữ liệu từ kho dữ liệu của ứng dụng vào kho dữ liệu Health Connect.

Chuẩn bị dữ liệu của bạn

Thông thường, bản ghi trong kho dữ liệu của ứng dụng có các thông tin chi tiết sau:

  • Một khoá duy nhất, chẳng hạn như UUID.
  • Số phiên bản hoặc dấu thời gian.

Hãy thiết kế kho dữ liệu của ứng dụng để theo dõi dữ liệu nào đã được cấp cho Health Connect. Để thực hiện điều này, hãy áp dụng logic sau:

  • Cung cấp danh sách thay đổi và mã thông báo có thể được dùng để truy xuất các bản ghi được cập nhật kể từ thời điểm mã thông báo gần đây nhất được phát hành.
  • Theo dõi lần sửa đổi gần nhất đối với dữ liệu đã xuất.

Đây là những bước cần thiết để đảm bảo rằng chỉ dữ liệu mới hoặc dữ liệu đã cập nhật mới được cấp cho Health Connect.

Ghi dữ liệu vào Health Connect

Để cấp dữ liệu vào Health Connect, hãy làm theo các bước sau:

  1. Nhận danh sách mục mới hoặc đã cập nhật từ kho dữ liệu của ứng dụng.
  2. Đối với mỗi mục, hãy tạo một đối tượng Record phù hợp với loại dữ liệu đó. Ví dụ: tạo một đối tượng WeightRecord cho dữ liệu liên quan đến cân nặng.
  3. Chỉ định một đối tượng Metadata cho mỗi Record bằng cách sử dụng khoá duy nhất và thông tin duy nhất về phiên bản trên kho dữ liệu của ứng dụng: Nếu dữ liệu chưa được tạo phiên bản, bạn có thể chuyển sang sử dụng giá trị Long của dấu thời gian hiện tại.

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. Chèn và cập nhật dữ liệu cho Health Connect bằng cách sử dụng insertRecords. Việc chèn và cập nhật dữ liệu có nghĩa là mọi dữ liệu hiện có trong Health Connect sẽ bị ghi đè, chừng nào các giá trị clientRecordId trong kho dữ liệu Health Connect vẫn tồn tại và clientRecordVersion cao hơn giá trị hiện có. Nếu không, dữ liệu được chèn và cập nhật sẽ được ghi dưới dạng dữ liệu mới.

    healthConnectClient.insertRecords(arrayListOf(record))
    

Để tìm hiểu các vấn đề cần cân nhắc khi cấp dữ liệu trên thực tế, hãy xem các phương pháp hay nhất về Ghi dữ liệu.

Lưu trữ mã nhận dạng Health Connect

Sau khi chèn và cập nhật bản ghi lên Health Connect, kho dữ liệu của ứng dụng cần lưu trữ id của Health Connect cho mỗi bản ghi. Điều này cho phép ứng dụng của bạn kiểm tra xem có phải tạo bản ghi mới cho từng thay đổi sắp tới hay không, hoặc cập nhật bản ghi hiện có sau khi bạn lấy dữ liệu.

Hàm insertRecords sẽ trả về một InsertRecordsResponse có chứa danh sách giá trị id. Dùng phản hồi để nhận mã nhận dạng Record (Bản ghi) và lưu trữ các mã này.

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

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

Lấy dữ liệu từ Health Connect

Phần thứ hai của quy trình đồng bộ hoá là lấy mọi thay đổi về dữ liệu từ Health Connect về kho dữ liệu của ứng dụng. Thay đổi về dữ liệu có thể gồm cả việc cập nhật và xoá.

Nhận mã thông báo Changes

Để nhận danh sách thay đổi cần lấy từ Health Connect, ứng dụng của bạn cần theo dõi mã thông báo Changes (Thay đổi). Bạn có thể sử dụng các mã thông báo này khi yêu cầu Changes trả về cả danh sách thay đổi về dữ liệu và mã thông báo Changes mới để dùng vào lần tiếp theo.

Để nhận mã thông báo Changes, hãy gọi getChangesToken và cung cấp các loại dữ liệu bắt buộc.

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

Kiểm tra các thay đổi về dữ liệu

Giờ bạn đã nhận được mã thông báo Changes, hãy sử dụng mã thông báo này để nhận tất cả Changes. Bạn nên tạo một vòng lặp để kiểm tra tất cả Changes xem có thay đổi nào về dữ liệu không. Sau đây là các bước thực hiện:

  1. Gọi getChanges bằng mã thông báo này để lấy danh sách Changes.
  2. Kiểm tra từng thay đổi để xem loại thay đổi là UpsertionChange hay DeletionChange, rồi thực hiện các thao tác cần thiết.
    • Đối với UpsertionChange, chỉ thực hiện các thay đổi không đến từ ứng dụng gọi để đảm bảo rằng bạn không nhập lại dữ liệu.
  3. Chỉ định mã thông báo Changes tiếp theo làm mã thông báo mới.
  4. Lặp lại Bước 1-3 cho đến khi không còn Changes nào.
  5. Lưu trữ mã thông báo tiếp theo và đặt trước mã đó để sau này nhập.
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
}

Để tìm hiểu các vấn đề cần cân nhắc khi lấy dữ liệu trên thực tế, hãy xem các phương pháp hay nhất về Đồng bộ hoá dữ liệu.

Xử lý các thay đổi về dữ liệu

Phản ánh các thay đổi đối với kho dữ liệu của ứng dụng. Đối với UpsertionChange, hãy sử dụng idlastModifiedTime trong metadata để chèn và cập nhật bản ghi. Đối với DeletionChange, hãy dùng id được cung cấp để xoá bản ghi đó.

Xoá dữ liệu khỏi Health Connect

Khi người dùng xoá dữ liệu của họ khỏi ứng dụng của bạn, hãy nhớ xoá dữ liệu đó khỏi Health Connect. Hãy sử dụng deleteRecords để thực hiện việc này. Thao tác này sẽ lấy danh sách giá trị idclientRecordId để thuận tiện cho việc phân nhóm nhiều dữ liệu để xoá.