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

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

מה תפַתחו

ב-Codelab הזה תלמדו איך לפתח אפליקציה ל-Android עם ספריית תיעוד נתונים מובנים. האפליקציה שלך תשתמש בספריית הנתונים המובְנים כדי לעבד את השאלונים והתשובות של FHIR.

מה תלמדו

  • איך משלבים את ספריית הנתונים המובְנים באפליקציה ל-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, בוחרים באפשרות ייבוא פרויקט (Gradle, Eclipse ADT וכו') ובוחרים את התיקייה codelabs/datacapture מקוד המקור שהורדתם קודם.

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

הפעלת האפליקציה לתחילת פעולה

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

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

אפליקציית 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

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

בסרגל הכלים של 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 (רזולוציה > פריסה > 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. השאלון קטן (פחות מ-512KB), ולכן הוא יכלול כ-String ב-Bundle של ארגומנטים שישמשו ליצירת המקטע. כדי לשמור על רמת ביצועים, יש לספק שאלונים גדולים יותר כ-URI.

אתם יכולים לעיין בקובץ questionnaire.json אם רוצים, אבל אחד מהיתרונות של ספריית איסוף הנתונים המובְנים הוא שאין צורך לדעת איך מבנה השאלון FHIR (או כל דבר אחר על FHIR) כדי לקבל אותו כדי לעבד אותו. בהמשך תבדקו את הקובץ הזה בצורה מפורטת יותר ב-Codelab.

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

איך משתמשים במקטעים

כדי להריץ את Codelab, לוחצים על 'הפעלה' (לחצן הרצה) בסרגל הכלים של Android Studio. אתם אמורים לראות משהו כזה:

שאלון שעבר עיבוד באמצעות &#39;אמולטור&#39;

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

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

השלבים הבאים

  • לעיון בתיעוד של ספריית איסוף הנתונים המובְנים
  • התאמה אישית של העיצוב והסגנון של השאלונים שעברו רינדור
  • החלת ספריית לכידת נתונים מובנים באפליקציה ל-Android

מידע נוסף