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

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

מה תפַתחו

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

מה תלמדו

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

מה נדרש

סדנת הקוד הזו מתמקדת ב-Structured Data Capture Library. מושגים וחסימות קוד לא רלוונטיים מוצגים בקצרה, וניתן פשוט להעתיק ולהדביק אותם. אם עדיין לא יצרתם אפליקציות ל-Android, תוכלו להתחיל בפיתוח האפליקציה הראשונה.

2. להגדרה

הורדת הקוד

כדי להוריד את הקוד של סדנת הקוד הזו, צריך לשכפל את המאגר של 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.) ובוחרים את התיקייה codelabs/datacapture מקוד המקור שהורדתם מקודם.

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

הפעלת האפליקציה למתחילים

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

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

אפליקציית Hello World

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

3. הוספת ספריית Structured Data Capture Library לפרויקט

הוספת יחסי התלות של ספריית תיעוד הנתונים המובְנים

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

בוחרים באפשרות סנכרון הפרויקט עם קובצי Gradle (לחצן הסנכרון של Gradle) בסרגל הכלים של Android Studio. אפשר גם להריץ את האפליקציה שוב כדי לבדוק אם יחסי התלות פועלים כמו שצריך.

4. הצגת שאלון

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

יוצרים 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()
}

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

כדי להריץ את הקוד, לוחצים על סמל ההרצה (לחצן ההפעלה) בסרגל הכלים של 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. בקודלאב הזה נעשה שימוש בספריות אחרות של 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 בספריית Structure Data Capture Library.

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

מחפשים את השיטה 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 Bundle שחולץ.

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 Library כדי לעבד שאלונים ותשובות בפורמט FHIR באפליקציה:

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

זה כל מה שצריך כדי להפעיל את השירות.

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

מה עסקנו בו

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

השלבים הבאים

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

מידע נוסף