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

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.0.0")
    implementation("androidx.fragment:fragment-ktx:1.5.5")
}

將專案與 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. 在版面配置編輯器的右上方,找到程式碼、分割和設計檢視畫面的選項。
  3. 選取「程式碼檢視」。版面配置檢視選項
  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 新增至 FragmentContainerView

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

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

進一步瞭解如何使用片段

請按一下 Android Studio 工具列中的「執行」圖示 (「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 字串,以便在記錄中查看。

再次執行應用程式,以最新變更重新建構應用程式。開始作答後,請在問卷中輸入一些資訊,然後輕觸「提交」。您應該在記錄中看見一則訊息,其中包含採用 JSON 的 QuestionnaireResponse

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 資源的問卷回覆稱為「資料擷取」。方法是使用結構化資料擷取資料庫的 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 交易套裝組合,在本例中僅為一個病患資源。

再次執行應用程式,以最新變更重新建構應用程式。代碼開始執行後,請輸入一些資訊並輕觸「提交」。記錄檔中現在應會顯示訊息 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 Engine 程式庫,瞭解如何在應用程式中儲存及管理 FHIR 資源,以及與遠端 FHIR 伺服器同步處理資料。

涵蓋內容

  • 如何在 Android 應用程式中加入結構化資料擷取程式庫
  • 如何透過 QuestionnaireFragmentResourceMapper 處理 FHIR 問卷

後續步驟

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

瞭解詳情