تسجيل البيانات الصحية ومعالجتها باستخدام "مكتبة تسجيل البيانات المنظَّمة"

1. قبل البدء

ما ستُنشئه

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية إنشاء تطبيق Android باستخدام مكتبة "التقاط البيانات المنظَّمة". سيستخدم تطبيقك مكتبة Structured Data Capture Library لعرض استبيانات FHIR والردود ومعالجتها.

المُعطيات

  • كيفية دمج مكتبة Structured Data Capture Library في تطبيق Android
  • كيفية عرض استبيان
  • كيفية الحصول على إجابات بصفتك QuestionnaireResponse
  • كيفية استخراج موارد FHIR من QuestionnaireResponse

المتطلبات

تركّز هذه الدرسّات التطبيقية على مكتبة ميزة "التقاط البيانات المنظَّمة". يتم تجاهل المفاهيم غير ذات الصلة ووحدات الرموز البرمجية، ويتم توفيرها لك لنسخها ولصقها بسهولة. إذا لم يسبق لك إنشاء تطبيقات Android، يمكنك البدء من خلال إنشاء تطبيقك الأول.

2. الإعداد

تنزيل الرمز

لتنزيل رمز هذا الدليل التعليمي، يمكنك استنساخ مستودع حزمة تطوير البرامج (SDK) لنظام التشغيل Android لمعيار FHIR: git clone https://github.com/google/android-fhir.git

يمكن العثور على المشروع الأوّلي لهذا الدرس التطبيقي حول الترميز في codelabs/datacapture.

استيراد التطبيق إلى Android Studio

لنبدأ باستيراد التطبيق المبدئي إلى Android Studio.

افتح Android Studio، واختَر Import Project (استيراد المشروع) (Gradle أو Eclipse ADT أو غير ذلك)، ثم اختَر مجلد codelabs/datacapture من رمز المصدر الذي نزّلته سابقًا.

شاشة بدء "استوديو Android"

تشغيل التطبيق النموذجي

بعد استيراد المشروع إلى "استوديو Android"، تكون مستعدًا لتشغيل التطبيق للمرة الأولى.

وصِّل جهاز Android عبر USB بالجهاز المضيف، أو ابدأ محاكي Android Studio، ثم انقر على رمز التشغيل (زر التشغيل) في شريط أدوات Android Studio.

تطبيق Hello World

كما ترى، لا يتوفّر الكثير من المعلومات هنا بعد، لذا لنبدأ مباشرةً في عرض استبيان في تطبيقك.

3- إضافة مكتبة "التقاط البيانات المنظَّمة" إلى المشروع

إضافة التبعيات لـ "مكتبة تسجيل البيانات المنظَّمة"

تتيح لك التبعيات في مكتبة "التقاط البيانات المنظَّمة" دمج هذه المكتبة في تطبيقك. أضِف السطور التالية إلى نهاية ملف 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 sync) من شريط أدوات "استوديو Android". يمكنك أيضًا تشغيل التطبيق مرة أخرى للتأكّد من عمل التبعيات بشكل صحيح.

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. ابحث عن خيارات طرق عرض "الرمز" و"التقسيم" و"التصميم" في أعلى يسار "أداة تعديل التنسيق".
  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 لعرضه. بما أنّ الاستبيان صغير (أقل من 512 كيلوبايت)، يمكنك تضمينه كـ String في Bundle من الوسيطات التي سيتم استخدامها لإنشاء المقتطف. يجب تقديم الاستبيانات الأكبر حجمًا كURI لأسباب تتعلّق بالأداء.

يمكنك الاطّلاع على ملف questionnaire.json إذا أردت، ولكن من مزايا "مكتبة تسجيل البيانات المنظَّمة" أنّك لا تحتاج إلى معرفة بنية استبيان FHIR (أو أيّ شيء عن FHIR) لعرضه. ستتمكّن من الاطّلاع على هذا الملف عن كثب لاحقًا في ورشة رموز البرامج.

أنشئ QuestionnaireFragment باستخدام أداة إنشائه، واضبط الاستبيان باستخدام الدالة "المُعدّة". لعرض 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(). يؤدي ذلك إلى عرض QuestionnaireResponse HAPI FHIR الذي يمكنك استخدامه مباشرةً أو مع أجزاء أخرى من حزمة تطوير البرامج (SDK) لنظام FHIR على Android. يستخدم هذا الدرس التطبيقي مكتبات 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 الذي سبق أن حصلنا عليه. ويعرض حِزمة معاملة 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- تهانينا!

إذا كنت قد استخدمت مكتبة Structured Data Capture Library لمعالجة استبيانات FHIR وردود المستخدمين في تطبيقك:

  • عرض استبيان
  • الحصول على ردّ على استبيان
  • استخراج موارد FHIR من QuestionnaireResponse

هذا كل ما عليك فعله لبدء استخدام التطبيق.

أثناء المتابعة، قد تحتاج إلى استخدام موارد FHIR بطرق إضافية في تطبيقك. اطّلِع على مكتبة FHIR Engine في حزمة تطوير البرامج لأجهزة Android لمعيار FHIR للتعرّف على كيفية تخزين موارد FHIR وإدارتها محليًا في تطبيقك ومزامنة البيانات مع خادم FHIR عن بُعد.

المواضيع التي تناولناها

  • كيفية إضافة مكتبة "التقاط البيانات المنظَّمة" إلى تطبيق Android
  • كيفية استخدام QuestionnaireFragment وResourceMapper للعمل مع استبيانات FHIR

الخطوات التالية

  • استكشاف مستندات مكتبة Structured Data Capture Library
  • تخصيص شكل الاستبيانات المعروضة ومظهرها
  • تطبيق مكتبة Structured Data Capture Library في تطبيق Android الخاص بك

مزيد من المعلومات