Thu thập và xử lý dữ liệu sức khoẻ bằng Thư viện thu thập dữ liệu có cấu trúc

1. Trước khi bắt đầu

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo ứng dụng Android bằng Thư viện thu thập dữ liệu có cấu trúc. Ứng dụng của bạn sẽ sử dụng Thư viện thu thập dữ liệu có cấu trúc để kết xuất và xử lý Bảng câu hỏi và câu trả lời FHIR.

Kiến thức bạn sẽ học được

  • Cách tích hợp Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng Android
  • Cách hiển thị Bảng câu hỏi
  • Cách nhận câu trả lời dưới dạng QuestionnaireResponse
  • Cách trích xuất tài nguyên FHIR từ QuestionnaireResponse

Bạn cần có

Lớp học lập trình này tập trung vào Thư viện thu thập dữ liệu có cấu trúc. Các khái niệm và khối mã không liên quan được làm mờ và cung cấp cho bạn để sao chép và dán. Nếu chưa từng tạo ứng dụng Android trước đó thì bạn có thể bắt đầu bằng cách tạo ứng dụng đầu tiên.

2. Bắt đầu thiết lập

Tải mã nguồn xuống

Để tải đoạn mã cho lớp học lập trình này, hãy sao chép kho lưu trữ SDK Android FHIR: git clone https://github.com/google/android-fhir.git

Dự án khởi đầu cho lớp học lập trình này nằm trong codelabs/datacapture.

Nhập ứng dụng vào Android Studio

Hãy bắt đầu bằng cách nhập ứng dụng khởi đầu vào Android Studio.

Mở Android Studio, chọn Import Project (Gradle, Eclipse ADT, v.v.) rồi chọn thư mục codelabs/datacapture trong mã nguồn mà bạn đã tải xuống trước đó.

Màn hình bắt đầu của Android Studio

Chạy ứng dụng khởi đầu

Sau khi nhập dự án vào Android Studio, bạn có thể chạy ứng dụng lần đầu tiên.

Kết nối thiết bị Android với máy chủ lưu trữ của bạn qua USB hoặc Khởi động trình mô phỏng Android Studio rồi nhấp vào biểu tượng Chạy (Nút Run (Chạy)) trên thanh công cụ Android Studio.

Ứng dụng Hello World

Như bạn có thể thấy, chưa có nhiều thứ ở đây, vì vậy, hãy bắt đầu ngay vào việc hiển thị một bảng câu hỏi trong ứng dụng của bạn!

3. Thêm Thư viện thu thập dữ liệu có cấu trúc vào dự án

Thêm phần phụ thuộc cho Thư viện thu thập dữ liệu có cấu trúc

Phần phụ thuộc Thư viện thu thập dữ liệu có cấu trúc cho phép bạn tích hợp Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng của mình. Hãy thêm các dòng sau vào cuối tệp app/build.gradle.kts của dự án:

dependencies {
    // ...

    implementation("com.google.android.fhir:data-capture:1.0.0")
    implementation("androidx.fragment:fragment-ktx:1.5.5")
}

Đồng bộ hoá dự án của bạn với các tệp Gradle

Để đảm bảo ứng dụng có sẵn tất cả phần phụ thuộc, bạn nên đồng bộ hoá dự án với các tệp gradle tại thời điểm này.

Chọn Sync Project with Gradle Files (Nút đồng bộ hoá Gradle) (Đồng bộ hoá dự án với tệp Gradle) trên thanh công cụ của Android Studio. Bạn cũng chạy lại ứng dụng để kiểm tra các phần phụ thuộc đang hoạt động chính xác.

4. Hiện bảng câu hỏi

Ở bước này, bạn sẽ thêm chức năng này vào ứng dụng khởi đầu để hiển thị bảng câu hỏi trong FragmentContainerView.

Đồng thời, Android Studio sẽ nhắc bạn thêm các lệnh nhập cần thiết:

  • androidx.core.os.bundleOf
  • androidx.fragment.app.add
  • androidx.fragment.app.commit
  • android.util.Log
  • com.google.android.fhir.datacapture.QuestionnaireFragment

Bước 1: Thêm FragmentContainerView

Thêm FragmentContainerView vào bố cục của ứng dụng. Đây là nơi hiển thị QuestionnaireFragment mà bạn sẽ tạo sau này.

  1. Mở activity_main.xml (res > layout > activity_main.xml).
  2. Tìm các tuỳ chọn cho các chế độ xem Mã, Phân tách và Thiết kế ở phía trên bên phải của Layout Editor.
  3. Chọn Chế độ xem mã. Tuỳ chọn khung hiển thị bố cục
  4. Bạn không cần đến TextView nữa nên có thể xoá thành phần hiển thị này. Hãy nhớ xoá toàn bộ nội dung từ thẻ mở <TextView đến hết thẻ đóng />.
  5. Thêm FragmentContainerView vào bên trong ConstraintLayout. Tệp activity_main.xml của bạn sẽ có dạng như sau:
    <?xml version="1.0" encoding="utf-8" ?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
    >
    
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

Bước 2: Thêm QuestionnaireFragment vào FragmentContainerView

QuestionnaireFragment cần có Bảng câu hỏi FHIR được mã hoá JSON để kết xuất. Vì bảng câu hỏi có kích thước nhỏ (<512 KB), nên bạn sẽ đưa bảng câu hỏi này vào dưới dạng String trong Bundle đối số sẽ dùng để tạo mảnh. Vì lý do hiệu suất, bạn nên cung cấp các bảng câu hỏi lớn hơn dưới dạng URI.

Bạn có thể xem tệp questionnaire.json nếu muốn. Tuy nhiên, một trong những lợi ích của Thư viện thu thập dữ liệu có cấu trúc là bạn không cần phải biết cấu trúc của Bảng câu hỏi FHIR (hoặc bất kỳ thông tin nào về FHIR) để có thể kết xuất hình ảnh! Bạn sẽ tìm hiểu kỹ hơn về tệp này ở các phần sau trong lớp học lập trình.

Tạo QuestionnaireFragment bằng trình tạo và đặt bảng câu hỏi bằng hàm setter. Để hiển thị QuestionnaireFragment trong vùng chứa bố cục, hãy sử dụng FragmentManager để tạo FragmentTransaction.

Mở MainActivity.kt rồi thêm mã sau vào lớp MainActivity:

// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")

if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(
      R.id.fragment_container_view,
      QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
    )
  }
}

Tìm hiểu thêm về cách sử dụng mảnh.

Hãy chạy lớp học lập trình này bằng cách nhấp vào biểu tượng Chạy (Nút Run (Chạy)) trên thanh công cụ của Android Studio. Bạn sẽ thấy nội dung tương tự như sau:

Bảng câu hỏi được kết xuất trong Trình mô phỏng

Di chuyển trong bảng câu hỏi rồi thử nhập một số câu trả lời. Có một vài tiện ích dùng để trả lời khác nhau, bao gồm cả boolean, văn bản và ngày tháng. Những tiện ích này được tự động hiển thị dựa trên loại cơ sở trong bảng câu hỏi FHIR ban đầu.

Về mặt kỹ thuật, đó là tất cả những gì bạn cần làm để hiển thị một bảng câu hỏi! Xin chúc mừng!

Tuy nhiên, bảng câu hỏi sẽ không hữu ích lắm nếu bạn không thấy câu trả lời mà người dùng đã nhập. Hãy chuyển sang bước tiếp theo là thu thập Câu trả lời trong bảng câu hỏi!

5. Nhận câu trả lời trong bảng câu hỏi

Ở các bước trước, bạn đã hiển thị một bảng câu hỏi FHIR trong ứng dụng của mình.

Trong mục này, bạn sẽ nhận được câu trả lời trong bảng câu hỏi dưới dạng Bảng câu hỏi phản hồi.

Tìm phương thức submitQuestionnaire() và thêm mã sau:

// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
        as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()

// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
    jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)

Để nhận câu trả lời cho bảng câu hỏi, bạn truy xuất mảnh của bảng câu hỏi đã tạo trước đó rồi sử dụng phương thức getQuestionnaireResponse(). Thao tác này sẽ trả về một HAPI FHIR QuestionnaireResponse mà bạn có thể sử dụng trực tiếp hoặc với các phần khác của SDK FHIR Android. Lớp học lập trình này sử dụng các thư viện HAPI FHIR khác để chuyển đổi chuỗi thành chuỗi JSON để xem trong nhật ký.

Chạy lại ứng dụng để tạo lại ứng dụng với những thay đổi mới nhất. Sau khi trả lời câu hỏi, hãy nhập một số thông tin vào bảng câu hỏi rồi nhấn vào Gửi. Trong nhật ký, bạn sẽ thấy một thông báo chứa QuestionnaireResponse dưới dạng JSON.

D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}

6. Trích xuất tài nguyên FHIR từ một câu hỏi

Bộ câu hỏi đi kèm với dự án khởi động là dành cho quy trình đăng ký bệnh nhân đơn giản, vì vậy, cuối cùng bạn nên sử dụng câu trả lời của bảng câu hỏi để tạo tài nguyên Bệnh nhân FHIR dựa trên các câu hỏi đó. Lượt chuyển đổi từ một câu trả lời trong bảng câu hỏi đến các tài nguyên FHIR được gọi là trích xuất dữ liệu. Chúng ta có thể thực hiện việc này bằng lớp ResourceMapper của Thư viện thu thập dữ liệu có cấu trúc.

Để trích xuất dữ liệu, bảng câu hỏi của bạn phải có tên là bảng câu hỏi, bao gồm cả thông tin về cách trích xuất dữ liệu. Thật may là bảng câu hỏi mẫu đã được thiết lập để trích xuất dựa trên định nghĩa.

Tìm phương thức submitQuestionnaire() và thêm mã sau:

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

ResourceMapper.extract() yêu cầu phải có Bảng câu hỏi HAPI FHIR. Bạn có thể tạo bảng câu hỏi này bằng cách phân tích cú pháp chuỗi JSON của bảng câu hỏi trước đó và QuestionnaireResponse đã nhận được trước đó. Hàm này trả về một Gói giao dịch HAPI FHIR chứa một hoặc nhiều tài nguyên được trích xuất. Trong trường hợp này, là một tài nguyên Bệnh nhân duy nhất.

Chạy lại ứng dụng để tạo lại ứng dụng với những thay đổi mới nhất. Khi chương trình chạy, hãy nhập một số thông tin rồi nhấn vào Gửi. Trong nhật ký, bạn sẽ thấy một thông báo extraction result chứa nội dung biểu diễn JSON của Gói FHIR đã trích xuất.

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. Xin chúc mừng!

Bạn đã sử dụng Thư viện thu thập dữ liệu có cấu trúc để xử lý bảng câu hỏi và câu trả lời FHIR trong ứng dụng của mình:

  • Hiện bảng câu hỏi
  • Nhận câu trả lời trong bảng câu hỏi
  • Trích xuất tài nguyên FHIR từ QuestionnaireResponse

Đó là tất cả những gì bạn cần để thiết lập và chạy ứng dụng!

Trong quá trình tiếp tục, có thể bạn sẽ muốn làm việc với các tài nguyên về FHIR theo nhiều cách hơn trong suốt ứng dụng của mình. Hãy xem Thư viện FHIR Engine của Android FHIR SDK để tìm hiểu cách lưu trữ và quản lý tài nguyên FHIR cục bộ trong ứng dụng cũng như đồng bộ hoá dữ liệu với một máy chủ FHIR từ xa.

Nội dung chúng ta đã đề cập

  • Cách thêm Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng Android
  • Cách sử dụng QuestionnaireFragmentResourceMapper để làm việc với bảng câu hỏi FHIR

Các bước tiếp theo

  • Khám phá tài liệu về Thư viện thu thập dữ liệu có cấu trúc
  • Tuỳ chỉnh giao diện của bảng câu hỏi được hiển thị
  • Áp dụng Thư viện thu thập dữ liệu có cấu trúc trong ứng dụng Android của riêng bạn

Tìm hiểu thêm