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

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/ohs-foundation/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

יחסי התלות של ספריית איסוף הנתונים המובְנים מאפשרים לכם לשלב את ספריית איסוף הנתונים המובְנים באפליקציה שלכם. מוסיפים את השורות הבאות לסוף הקובץ 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 sync\n(סנכרון 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 לפריסה של האפליקציה. כאן יוצגו תצורות ה-QuestionnaireFragmentGem שתיצרו בהמשך.

  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, אבל אחד היתרונות של ספריית הנתונים המובנים הוא שלא צריך להכיר את המבנה של שאלון 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, לוחצים על סמל ההרצה (כפתור ההפעלה) בסרגל הכלים של 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 משלכם

מידע נוסף