บันทึกและประมวลผลข้อมูลสุขภาพด้วยไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง

1. ก่อนเริ่มต้น

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีสร้างแอป Android ด้วยไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง แอปจะใช้ไลบรารีการบันทึกข้อมูลที่มีโครงสร้างเพื่อแสดงผลและประมวลผลแบบสอบถามและคำตอบของ FHIR

สิ่งที่คุณจะได้เรียนรู้

  • วิธีผสานรวมไลบรารีการบันทึกข้อมูลที่มีโครงสร้างเข้ากับแอปพลิเคชัน Android ของคุณ
  • วิธีแสดงแบบสอบถาม
  • วิธีรับคำตอบในฐานะ QuestionnaireResponse
  • วิธีดึงข้อมูลทรัพยากร FHIR จาก QuestionnaireResponse

สิ่งที่ต้องมี

  • Android Studio เวอร์ชันล่าสุด (v4.1.2+)
  • โปรแกรมจำลอง Android หรืออุปกรณ์ Android จริง
  • โค้ดตัวอย่าง
  • ความรู้พื้นฐานเกี่ยวกับการพัฒนา Android ใน Kotlin

Codelab นี้มุ่งเน้นที่ไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง แนวคิดและโค้ดบล็อกที่ไม่เกี่ยวข้องจะถูกวางซ้อนและให้คุณคัดลอกและวางได้ง่ายๆ หากคุณยังไม่เคยสร้างแอป Android มาก่อน คุณสามารถเริ่มด้วยการสร้างแอปแรกของคุณ

2. ตั้งค่า

ดาวน์โหลดโค้ด

หากต้องการดาวน์โหลดโค้ดสำหรับ Codelab นี้ ให้โคลนที่เก็บ Android FHIR SDK: git clone https://github.com/google/android-fhir.git

โปรเจ็กต์เริ่มต้นสำหรับ Codelab นี้อยู่ใน codelabs/datacapture

นําเข้าแอปไปยัง Android Studio

มาเริ่มด้วยการนำเข้าแอปเริ่มต้นไปยัง Android Studio

เปิด Android Studio เลือกนำเข้าโปรเจ็กต์ (Gradle, Eclipse ADT เป็นต้น) แล้วเลือกโฟลเดอร์ codelabs/datacapture จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

หน้าจอเริ่มต้น Android Studio

เรียกใช้แอปเริ่มต้น

เมื่อนำเข้าโปรเจ็กต์ลงใน Android Studio แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก

เชื่อมต่ออุปกรณ์ Android ผ่าน USB กับโฮสต์ หรือเริ่มโปรแกรมจำลอง Android Studio แล้วคลิก "เรียกใช้" (ปุ่มเรียกใช้) ในแถบเครื่องมือ Android Studio

แอป Hello World

คุณจะเห็นว่ายังไม่มีข้อมูลในขณะนี้ ดังนั้นมาเริ่มแสดงแบบสอบถามในแอปของคุณกัน

3. เพิ่มไลบรารีการบันทึก Structured Data ลงในโปรเจ็กต์

เพิ่มทรัพยากร Dependency สำหรับไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง

ทรัพยากร Dependency ของไลบรารีการบันทึกข้อมูลที่มีโครงสร้างช่วยให้คุณผสานรวมไลบรารีการบันทึกข้อมูลที่มีโครงสร้างลงในแอปได้ เพิ่มบรรทัดต่อไปนี้ต่อท้ายไฟล์ 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 ในขั้นตอนนี้เพื่อให้แอปสามารถใช้ทรัพยากร Dependency ทั้งหมด

เลือกซิงค์โปรเจ็กต์ด้วยไฟล์ Gradle (ปุ่มซิงค์ Gradle) จากแถบเครื่องมือ Android Studio นอกจากนี้คุณยังเรียกใช้แอปอีกครั้งได้เพื่อตรวจสอบว่าทรัพยากร Dependency ทำงานอย่างถูกต้อง

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 >ใช้ชื่อ > activity_main.xml)
  2. หาตัวเลือกสำหรับมุมมองโค้ด แยก และการออกแบบที่ด้านขวาบนของเครื่องมือแก้ไขเลย์เอาต์
  3. เลือกมุมมองโค้ดตัวเลือกมุมมองเลย์เอาต์
  4. คุณไม่จำเป็นต้องใช้ TextView โปรดลบเครื่องหมายดังกล่าว อย่าลืมลบข้อมูลทุกอย่างตั้งแต่ <TextView จนถึง /> ปิด
  5. เพิ่ม FragmentContainerView ใน ConstraintLayout ไฟล์ 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 ต้องใช้แบบสอบถาม FHIR ที่เข้ารหัสด้วย JSON เพื่อให้แสดงผลได้ เนื่องจากแบบสอบถามมีขนาดเล็ก (<512 KB) คุณจะรวมแบบสอบถามดังกล่าวเป็น String ในอาร์กิวเมนต์ Bundle ที่จะใช้สร้างส่วนย่อย ควรระบุแบบสอบถามขนาดใหญ่เป็น URI เพื่อเหตุผลด้านประสิทธิภาพ

คุณจะดูไฟล์ questionnaire.json ได้หากต้องการ แต่ข้อดีอย่างหนึ่งของไลบรารีการบันทึกข้อมูลที่มีโครงสร้างคือคุณไม่จำเป็นต้องทราบโครงสร้างของแบบสอบถาม FHIR (หรือสิ่งอื่นใดเกี่ยวกับ FHIR) เพื่อให้แสดงผลได้ คุณจะดูไฟล์นี้โดยละเอียดได้ใน Codelab ในภายหลัง

สร้าง QuestionnaireFragment โดยใช้เครื่องมือสร้างและตั้งค่าแบบสอบถามโดยใช้ฟังก์ชันตัวตั้งค่า หากต้องการแสดง 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()
    )
  }
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ส่วนย่อย

มาเรียกใช้ Codelab โดยคลิกเรียกใช้ (ปุ่มเรียกใช้) ในแถบเครื่องมือ Android Studio คุณจะเห็นข้อมูลที่คล้ายกันนี้

แบบสอบถามที่แสดงผลในโปรแกรมจำลอง

สำรวจแบบสอบถามและลองป้อนคำตอบ มีการใช้วิดเจ็ตคำตอบที่แตกต่างกัน 2-3 รายการ ซึ่งรวมถึงบูลีน ข้อความ และวันที่ ซึ่งแสดงผลโดยอัตโนมัติตามประเภทที่สําคัญในแบบสอบถาม 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 ได้ Codelab นี้ใช้ไลบรารี 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. ดึงข้อมูลทรัพยากร FHIR จาก 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 ที่เราได้รับแล้วก่อนหน้านี้ และแสดงผล Bundle ธุรกรรม HAPI FHIR ที่มีทรัพยากรที่ดึงมาอย่างน้อย 1 รายการ ซึ่งในกรณีนี้เป็นทรัพยากรสำหรับผู้ป่วยรายการเดียว

เรียกใช้แอปอีกครั้งเพื่อสร้างแอปขึ้นใหม่ตามการเปลี่ยนแปลงล่าสุด เมื่อระบบทำงาน ให้ป้อนข้อมูลและแตะส่ง ในบันทึก คุณควรเห็นข้อความ extraction result ที่มีการแสดงแทน JSON ของแพ็กเกจ FHIR ที่ดึงข้อมูล

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 ในแอปแล้ว

  • แสดงแบบสอบถาม
  • รับการตอบกลับจากแบบสอบถาม
  • แยกทรัพยากร FHIR จาก QuestionnaireResponse

เพียงเท่านี้คุณก็จะสามารถเริ่มต้นใช้งานได้แล้ว

ระหว่างดำเนินการ คุณอาจต้องการใช้ทรัพยากร FHIR ในลักษณะอื่นๆ เพิ่มเติมตลอดแอปพลิเคชัน โปรดดูไลบรารี FHIR Engine ของ Android FHIR SDK เพื่อเรียนรู้วิธีจัดเก็บและจัดการทรัพยากร FHIR ภายในแอปพลิเคชันของคุณและซิงค์ข้อมูลกับเซิร์ฟเวอร์ FHIR ระยะไกล

สิ่งที่เราครอบคลุม

  • วิธีเพิ่มไลบรารีการบันทึกข้อมูลที่มีโครงสร้างลงในแอป Android
  • วิธีใช้ QuestionnaireFragment และ ResourceMapper เพื่อทำงานกับแบบสอบถาม FHIR

ขั้นตอนถัดไป

  • สำรวจเอกสารประกอบสำหรับไลบรารีการบันทึกข้อมูลที่มีโครงสร้าง
  • ปรับแต่งรูปลักษณ์และความรู้สึกของแบบสอบถามที่แสดงผล
  • ใช้ไลบรารีการบันทึก Structured Data ในแอป Android ของคุณเอง

ดูข้อมูลเพิ่มเติม