תיעוד ועיבוד של נתוני בריאות באמצעות ספרייה לתיעוד נתונים מובנה

1. לפני שמתחילים

מה תפַתחו

ב-codelab הזה תלמדו איך ליצור אפליקציית Android באמצעות ספריית Structured Data Capture. האפליקציה תשתמש בספריית Structured Data Capture כדי לעבד ולעבד שאלונים ותשובות של FHIR.

מה תלמדו

  • איך לשלב את Structured Data Capture Library באפליקציה ל-Android
  • איך מציגים שאלון
  • איך מקבלים תשובות בתור QuestionnaireResponse
  • איך מחלצים משאבי FHIR מ-QuestionnaireResponse

הדרישות

ה-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, בוחרים באפשרות Import Project (Gradle, Eclipse ADT, etc.) (ייבוא פרויקט (Gradle,‏ Eclipse ADT וכו')) ובוחרים את התיקייה codelabs/datacapture מקוד המקור שהורדתם קודם.

מסך הפתיחה של Android Studio

הפעלת האפליקציה לתחילת הדרך

אחרי שיובא הפרויקט ל-Android Studio, אפשר להריץ את האפליקציה בפעם הראשונה.

מחברים את מכשיר Android למארח באמצעות USB, או מפעילים את האמולטור של Android Studio ולוחצים על Run (הפעלה) (כפתור ההפעלה) בסרגל הכלים של Android Studio.

אפליקציית Hello World

כמו שאתם רואים, אין כאן הרבה תוכן עדיין, אז בואו נתחיל להציג שאלון באפליקציה שלכם.

3. הוספה של ספריית נתונים מובְנים לפרויקט

הוספת התלויות של Structured Data Capture Library

יחסי התלות של הספרייה Structured Data Capture מאפשרים לכם לשלב את הספרייה Structured Data Capture באפליקציה שלכם. מוסיפים את השורות הבאות לסוף הקובץ 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) ‏(לחצן הסנכרון של 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 (עיצוב) מוצגות בפינה השמאלית העליונה של Layout Editor.
  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

כדי ש-QuestionnaireFragment יוכל להציג שאלון FHIR, הוא צריך להיות מקודד ב-JSON. מכיוון שהשאלון קטן (פחות מ-512KB), הוא ייכלל כ-String ב-Bundle של ארגומנטים שישמשו ליצירת הפרגמנט. מטעמי ביצועים, שאלונים ארוכים יותר צריכים להישלח כקובץ URI.

אם רוצים, אפשר לעיין בקובץ questionnaire.json, אבל אחד היתרונות של Structured Data Capture Library הוא שלא צריך להכיר את המבנה של שאלון FHIR (או כל דבר שקשור ל-FHIR) כדי להציג אותו! בהמשך ה-codelab תבדקו את הקובץ הזה יותר לעומק.

יוצרים QuestionnaireFragment באמצעות ה-builder שלו, ומגדירים את השאלון באמצעות פונקציית ה-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 כדי ליצור FragmentTransaction. ה-FragmentManager מטפל ביצירת מופע באמצעות 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()
}

איך משתמשים בפרגמנטים

כדי להריץ את ה-codelab, לוחצים על Run (הפעלה) (כפתור ההפעלה) בסרגל הכלים של Android Studio. הפלט אמור להיראות כך:

שאלון שעבר עיבוד באמולטור

עוברים בין השאלות בשאלון ומנסים להזין תשובות. יש כמה ווידג'טים שונים של תשובות, כולל בוליאניים, טקסט ותאריכים, שעברו עיבוד אוטומטי על סמך הסוג הבסיסי בשאלון המקורי של 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 Patient שמבוסס עליהן. ההמרה הזו מתשובה לשאלון למשאבי FHIR נקראת חילוץ נתונים. אפשר לעשות את זה באמצעות המחלקה ResourceMapper של ספריית Structured Data Capture.

כדי לבצע חילוץ נתונים, השאלון צריך לכלול מידע על אופן החילוץ. למזלנו, שאלון לדוגמה כבר מוגדר לחילוץ על סמך הגדרה.

מחפשים את השיטה 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 שמכיל משאב אחד או יותר שחולצו – במקרה הזה משאב Patient יחיד.

מריצים את האפליקציה שוב כדי לבנות אותה מחדש עם השינויים האחרונים. אחרי שהאפליקציה פועלת, מזינים פרטים ומקישים על שליחה. בקטע היומן, אמורה להופיע עכשיו הודעה 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. מעולה!

השתמשתם בספריית Structured Data Capture כדי לעבד שאלונים ותשובות בפורמט FHIR באפליקציה שלכם:

  • הצגת שאלון
  • קבלת תשובה לשאלון
  • חילוץ משאבי FHIR מ-QuestionnaireResponse

זה כל מה שצריך לעשות כדי להתחיל להשתמש בו.

במהלך הפיתוח, יכול להיות שתרצו לעבוד עם משאבי FHIR בדרכים נוספות באפליקציה. כדי ללמוד איך לאחסן משאבי FHIR ולנהל אותם באופן מקומי באפליקציה ולסנכרן נתונים עם שרת FHIR מרוחק, אפשר לעיין ב-FHIR Engine Library של Android FHIR SDK.

מה נכלל

  • איך מוסיפים את Structured Data Capture Library לאפליקציית Android
  • איך משתמשים ב-QuestionnaireFragment וב-ResourceMapper כדי לעבוד עם שאלונים בפורמט FHIR

השלבים הבאים

  • עיון במסמכי התיעוד של Structured Data Capture Library
  • התאמה אישית של המראה והסגנון של שאלונים שעברו עיבוד
  • איך משתמשים בספרייה Structured Data Capture באפליקציית Android

מידע נוסף