運用結構化資料擷取資料庫擷取及處理健康資料

1. 事前準備

建構項目

在本程式碼研究室中,您將瞭解如何使用結構化資料擷取程式庫建構 Android 應用程式。您的應用程式會使用結構化資料擷取程式庫,轉譯及處理 FHIR 問卷和回應。

課程內容

  • 如何將結構化資料擷取程式庫整合至 Android 應用程式
  • 如何顯示問卷
  • 如何以 QuestionnaireResponse 的身分取得答案
  • 如何從 QuestionnaireResponse 中擷取 FHIR 資源

軟硬體需求

本程式碼研究室著重於結構化資料擷取程式庫。我們不會對與本主題無關的概念和程式碼多做介紹,但會事先準備好這些程式碼區塊,屆時您只要複製及貼上即可。如果您之前未建構過 Android 應用程式,可以先建構第一個應用程式

2. 做好準備

下載程式碼

如要下載此程式碼研究室的程式碼,請複製 Android FHIR SDK 存放區:git clone https://github.com/google/android-fhir.git

這個程式碼研究室的範例專案位於 codelabs/datacapture 中。

將應用程式匯入 Android Studio

首先,我們要將範例應用程式匯入 Android Studio。

開啟 Android Studio,選取「Import Project (Gradle, Eclipse ADT, etc.)」,然後從先前下載的來源程式碼中選擇 codelabs/datacapture 資料夾。

Android Studio 啟動畫面

執行範例應用程式

專案已匯入 Android Studio,您可以開始執行應用程式。

透過 USB 將 Android 裝置連接至主機,或啟動 Android Studio 模擬器,然後按一下 Android Studio 工具列中的「Run」(執行) (「Run」按鈕)。

Hello World 應用程式

如您所見,這裡還沒有太多內容,因此讓我們直接在應用程式中顯示問卷吧!

3. 將結構化資料擷取程式庫新增至專案

新增結構化資料擷取程式庫的依附元件

結構化資料擷取程式庫依附元件可讓您在應用程式中整合結構化資料擷取程式庫。請在專案的 app/build.gradle.kts 檔案結尾處加入下列行:

dependencies {
    // ...

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

將專案與 Gradle 檔案同步處理

為確保應用程式可使用所有依附元件,您應在此時將專案與 Gradle 檔案同步。

在 Android Studio 工具列中選取「Sync Project with Gradle Files」 (Gradle 同步按鈕)。您也可以再次執行應用程式,檢查依附元件是否正常運作。

4. 顯示問卷

在這個步驟中,您將為啟動器應用程式新增功能,以便在 FragmentContainerView 中顯示問卷。

在這個過程中,Android Studio 會提示您新增必要的匯入項目:

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

步驟 1:新增 FragmentContainerView

FragmentContainerView 新增至應用程式的版面配置。這裡會顯示您稍後建立的 QuestionnaireFragment

  1. 開啟 activity_main.xml (依序點選「res」>「layout」>「activity_main.xml」)
  2. 在版面配置編輯器的右上方,找到「Code」、「Split」和「Design」檢視畫面的選項。
  3. 選取「Code」檢視畫面。版面配置檢視畫面選項
  4. 您不需要 TextView,因此請將其刪除。請務必從 <TextView/> 結尾全部刪除。
  5. ConstraintLayout 中加入 FragmentContainerView。您的 activity_main.xml 檔案應類似如下:
    <?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>
    

步驟 2:設定 QuestionnaireFragment

QuestionnaireFragment 需要 JSON 編碼的 FHIR 問卷才能轉譯。由於問卷內容很小 (小於 512 KB),您可以在用來建立片段的引數 Bundle 中,將問卷內容納入 String。為提升效能,較大型的問卷應以 URI 的形式提供。

您可以查看 questionnaire.json 檔案,但結構化資料擷取程式庫的優點之一,就是您不必瞭解 FHIR 問卷的結構 (或任何有關 FHIR 的內容),就能讓系統轉譯這份問卷!您稍後會在程式碼研究室中更深入地瞭解這個檔案。

使用建構工具建立 QuestionnaireFragment,然後使用 setter 函式設定問卷。如要在版面配置容器中顯示 QuestionnaireFragment,請使用 FragmentManager 建立 FragmentTransaction

開啟 MainActivity.kt,並將下列程式碼新增至 MainActivity 類別:

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

val questionnaireFragment =
  QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()

步驟 3:將 QuestionnaireFragment 新增至 FragmentContainerView

如要在版面配置容器中顯示 QuestionnaireFragment,請使用 FragmentManager 建立 FragmentTransactionFragmentManager 會使用先前建立的 questionnaireParams 處理例項化作業。

MainActivity 類別中加入下列程式碼:

// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(R.id.fragment_container_view, questionnaireFragment)
  }
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
  QuestionnaireFragment.SUBMIT_REQUEST_KEY,
  this,
) { _, _ ->
  submitQuestionnaire()
}

進一步瞭解如何使用片段

讓我們按一下 Android Studio 工具列中的「Run」(「Run」按鈕),執行程式碼研究室。畫面應如下所示:

在模擬器中顯示的問卷

瀏覽問卷並嘗試輸入一些答案。系統會使用幾種不同的答案小工具,包括布林值、文字和日期,這些小工具會根據原始 FHIR 問卷中的基礎類型自動顯示。

從技術層面來說,只要完成這些步驟,就能算是呈現問卷了!恭喜!

不過,如果您無法查看使用者輸入的答案,問卷調查就沒有太大幫助。接下來,我們將繼續進行取得問卷回覆的步驟!

5. 取得問卷回覆

在上一個步驟中,您在應用程式中顯示 FHIR 問卷。

在本節中,您會以 QuestionnaireResponse 的形式取得問卷的答案。

找出 submitQuestionnaire() 方法,並新增以下程式碼:

// 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)

如要取得問卷回覆,請擷取先前建立的問卷片段,然後使用 getQuestionnaireResponse() 方法。這會傳回 HAPI FHIR QuestionnaireResponse,您可以直接使用,也可以搭配 Android FHIR SDK 的其他部分使用。本程式講義會使用其他 HAPI FHIR 程式庫,將其轉換為可在記錄中查看的 JSON 字串。

再次執行應用程式,以最新變更內容重新建構應用程式。執行後,請在問卷中輸入一些資訊,然後輕觸「提交」。在記錄中,您應該會看到包含 QuestionnaireResponse 的訊息,格式為 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. 從 QuestionnaireResponse 擷取 FHIR 資源

在入門專案中,我們提供的問卷調查是為了簡化病患註冊流程,因此您可能會想根據問卷調查的回覆,建立 FHIR 病患資源。從問卷回覆轉換為 FHIR 資源的過程稱為「資料擷取」。我們可以使用結構化資料擷取程式庫的 ResourceMapper 類別來執行這項操作。

如要執行資料擷取作業,您必須在撰寫問卷時,加入執行資料擷取作業的相關資訊。幸好,範例問卷已設定為以定義為依據的擷取

找出 submitQuestionnaire() 方法,並新增以下程式碼:

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

ResourceMapper.extract() 需要 HAPI FHIR 問卷,您可以透過剖析先前取得的問卷 JSON 字串,以及先前取得的 QuestionnaireResponse 來建立這類問卷。它會傳回 HAPI FHIR 交易 Bundle,其中包含一或多個擷取的資源,在本例中為單一病患資源。

再次執行應用程式,以最新變更內容重新建構應用程式。執行後,請輸入相關資訊,然後輕觸「提交」。您現在應該會在記錄中看到訊息 extraction result,其中包含擷取的 FHIR 套件 JSON 表示法。

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

7. 恭喜!

您已使用結構化資料擷取資料庫,在應用程式中處理 FHIR 問卷和回覆:

  • 顯示問卷
  • 取得問卷回覆
  • QuestionnaireResponse 擷取 FHIR 資源

只要完成這些步驟,就能開始使用了!

在後續步驟中,您可能會想在應用程式中以更多方式使用 FHIR 資源。請參閱 Android FHIR SDK 的 FHIR 引擎程式庫,瞭解如何在應用程式中本機儲存及管理 FHIR 資源,以及如何與遠端 FHIR 伺服器同步處理資料。

涵蓋內容

  • 如何在 Android 應用程式中新增結構化資料擷取程式庫
  • 如何使用 QuestionnaireFragmentResourceMapper 處理 FHIR 問卷

後續步驟

  • 查看結構化資料擷取資料庫的說明文件
  • 自訂轉譯問卷的外觀和風格
  • 在自家 Android 應用程式中套用結構化資料擷取程式庫

瞭解詳情