1. शुरू करने से पहले
आपको क्या बनाना होगा
इस कोडलैब में, FHIR इंजन लाइब्रेरी का इस्तेमाल करके Android ऐप्लिकेशन बनाया जा सकता है. आपका ऐप्लिकेशन, एफ़एचआईआर सर्वर से एफ़एचआईआर संसाधनों को डाउनलोड करने के लिए, एफ़एचआईआर इंजन लाइब्रेरी का इस्तेमाल करेगा. इसके अलावा, डिवाइस में किए गए बदलावों को सर्वर पर अपलोड करेगा.
आप इन चीज़ों के बारे में जानेंगे
- Docker का इस्तेमाल करके, लोकल HAPI FHIR सर्वर बनाने का तरीका
- FHIR इंजन लाइब्रेरी को अपने Android ऐप्लिकेशन के साथ इंटिग्रेट करने का तरीका
- एफ़एचआईआर संसाधनों को डाउनलोड और अपलोड करने के लिए, एक बार या बार-बार होने वाले जॉब सेट अप करने के लिए सिंक एपीआई का इस्तेमाल कैसे करें
- Search API इस्तेमाल करने का तरीका
- स्थानीय तौर पर एफ़एचआईआर संसाधनों को बनाने, पढ़ने, अपडेट करने, और मिटाने के लिए, Data Access API को इस्तेमाल करने का तरीका
आपको इनकी ज़रूरत होगी
- Docker (Docker पाएं)
- Android Studio (4.1.2 के बाद का वर्शन) का नया वर्शन
- Android Emulator या Android 7.0 Nougat या इसके बाद के वर्शन पर चलने वाला Android डिवाइस
- सैंपल कोड
- Kotlin में Android डेवलपमेंट की बुनियादी जानकारी
अगर आपने पहले Android ऐप्लिकेशन नहीं बनाए हैं, तो आप अपना पहला ऐप्लिकेशन बनाकर शुरुआत कर सकते हैं.
2. टेस्ट डेटा के साथ लोकल HAPI FHIR सर्वर सेट अप करना
HAPI FHIR एक लोकप्रिय ओपन सोर्स FHIR सर्वर है. Android ऐप्लिकेशन से कनेक्ट करने के लिए, हम अपने कोडलैब में लोकल HAPI FHIR सर्वर का इस्तेमाल करते हैं.
स्थानीय HAPI FHIR सर्वर को सेट अप करें
- HAPI FHIR
की सबसे नई इमेज पाने के लिए टर्मिनल में यहां दिए गए कमांड को चलाएंdocker pull hapiproject/hapi:latest
docker pull hapiproject/hapi:latest
- पिछली डाउनलोड की गई इमेज
hapiproject/hapi
को चलाने के लिए Docker डेस्कटॉप का इस्तेमाल करके या नीचे दिए गए निर्देश को चलाकर, HAPI FHIR कंटेनर को बनाएं
ज़्यादा जानें.docker run -p 8080:8080 hapiproject/hapi:latest
- सर्वर की जांच करने के लिए,
http://localhost:8080/
को ब्राउज़र में खोलें. आपको HAPI FHIR का वेब इंटरफ़ेस दिखना चाहिए.
लोकल HAPI FHIR सर्वर को टेस्ट डेटा से भरें
अपने ऐप्लिकेशन की जांच करने के लिए, हमें सर्वर पर कुछ टेस्ट डेटा की ज़रूरत होगी. हम Synthea से जनरेट किए गए सिंथेटिक डेटा का इस्तेमाल करेंगे.
- सबसे पहले, हमें सिंथिया-सैंपल से डेटा का सैंपल डाउनलोड करना होगा.
synthea_sample_data_fhir_r4_sep2019.zip
भाषा को डाउनलोड करें और एक्सट्रैक्ट करें. अन-ज़िप किए गए सैंपल डेटा में कई.json
फ़ाइलें होती हैं. हर फ़ाइल, अलग-अलग मरीज़ के लिए ट्रांज़ैक्शन बंडल के तौर पर होती है. - हम तीन मरीज़ों का टेस्ट डेटा, स्थानीय एचएपीआई एफ़एचआईआर सर्वर पर अपलोड करेंगे. JSON फ़ाइलों वाली डायरेक्ट्री में, यहां दिया गया निर्देश चलाएं
curl -X POST -H "Content-Type: application/json" -d @./Aaron697_Brekke496_2fa15bc7-8866-461a-9000-f739e425860a.json http://localhost:8080/fhir/ curl -X POST -H "Content-Type: application/json" -d @./Aaron697_Stiedemann542_41166989-975d-4d17-b9de-17f94cb3eec1.json http://localhost:8080/fhir/ curl -X POST -H "Content-Type: application/json" -d @./Abby752_Kuvalis369_2b083021-e93f-4991-bf49-fd4f20060ef8.json http://localhost:8080/fhir/
- सभी मरीज़ों का टेस्ट डेटा सर्वर पर अपलोड करने के लिए,
चलाएं हालांकि, इसे पूरा होने में ज़्यादा समय लग सकता है. साथ ही, कोडलैब के लिए यह ज़रूरी नहीं है.for f in *.json; do curl -X POST -H "Content-Type: application/json" -d @$f http://localhost:8080/fhir/ ; done
- ब्राउज़र में
http://localhost:8080/fhir/Patient/
यूआरएल खोलकर, पुष्टि करें कि टेस्ट डेटा सर्वर पर उपलब्ध है. आपको एफ़एचआईआर बंडल में मरीज़ के डेटा वाले पेज के टेक्स्टHTTP 200 OK
औरResponse Body
को खोज के नतीजे के तौर परtotal
संख्याके साथ देखना चाहिए.
3. Android ऐप्लिकेशन सेट अप करना
कोड डाउनलोड करें
इस कोडलैब का कोड डाउनलोड करने के लिए, Android FHIR SDK टूल की रिपॉज़िटरी का क्लोन बनाएं: git clone https://github.com/google/android-fhir.git
इस कोडलैब का स्टार्टर प्रोजेक्ट codelabs/engine
में मौजूद है.
ऐप्लिकेशन को Android Studio में इंपोर्ट करें
सबसे पहले, हम Android Studio में स्टार्टर ऐप्लिकेशन इंपोर्ट करते हैं.
Android Studio खोलें, Import Project (Gredle, Eclipse ADT वगैरह) चुनें और पहले से डाउनलोड किए गए सोर्स कोड से codelabs/engine/
फ़ोल्डर चुनें.
अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना
आपकी सुविधा के लिए, FHIR इंजन लाइब्रेरी डिपेंडेंसी को पहले ही प्रोजेक्ट में जोड़ा जा चुका है. इससे आपको अपने ऐप्लिकेशन में FHIR इंजन लाइब्रेरी को इंटिग्रेट करने की सुविधा मिल जाती है. अपने प्रोजेक्ट की app/build.gradle.kts
फ़ाइल के आखिर में, इन लाइनों को देखें:
dependencies {
// ...
implementation("com.google.android.fhir:engine:0.1.0-beta05")
}
यह पक्का करने के लिए कि आपके ऐप्लिकेशन पर सभी डिपेंडेंसी उपलब्ध हों, आपको इस समय अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना चाहिए.
Android Studio के टूलबार से, Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें () चुनें. साथ ही, ऐप्लिकेशन को फिर से चलाकर देखें कि डिपेंडेंसी ठीक से काम कर रही है या नहीं.
स्टार्टर ऐप्लिकेशन चलाएं
अब जब आपने Android Studio में प्रोजेक्ट इंपोर्ट कर लिया है, तो अब आप इस ऐप्लिकेशन को पहली बार इस्तेमाल कर सकते हैं.
Android Studio एम्युलेटर शुरू करें. इसके बाद, Android Studio टूलबार में, 'चलाएं' () पर क्लिक करें.
4. FHIR इंजन इंस्टेंस बनाएं
अपने Android ऐप्लिकेशन में FHIR इंजन को शामिल करने के लिए, आपको FHIR इंजन लाइब्रेरी का इस्तेमाल करना होगा और FHIR इंजन का एक इंस्टेंस शुरू करना होगा. नीचे बताए गए चरणों से, आपको इस प्रोसेस को पूरा करने में मदद मिलेगी.
- अपनी ऐप्लिकेशन क्लास पर जाएं. इस उदाहरण में
FhirApplication.kt
है, जोapp/src/main/java/com/google/android/fhir/codelabs/engine
में मौजूद है. - FHIR इंजन को शुरू करने के लिए,
onCreate()
तरीके में नीचे दिया गया कोड जोड़ें:
ध्यान दें:FhirEngineProvider.init( FhirEngineConfiguration( enableEncryptionIfSupported = true, RECREATE_AT_OPEN, ServerConfiguration( baseUrl = "http://10.0.2.2:8080/fhir/", httpLogger = HttpLogger( HttpLogger.Configuration( if (BuildConfig.DEBUG) HttpLogger.Level.BODY else HttpLogger.Level.BASIC, ), ) { Log.d("App-HttpLog", it) }, ), ), )
enableEncryptionIfSupported
: अगर डिवाइस पर डेटा एन्क्रिप्ट (सुरक्षित) करने की सुविधा काम करती है, तो इसे चालू कर देता है.RECREATE_AT_OPEN
: इससे डेटाबेस की गड़बड़ी की रणनीति तय की जाती है. ऐसे मामले में, अगर खुलने पर कोई गड़बड़ी होती है, तो यह डेटाबेस को फिर से बनाता है.ServerConfiguration
मेंbaseUrl
: यह FHIR सर्वर का बेस यूआरएल है. दिया गया आईपी पता10.0.2.2
खास तौर पर localhost के लिए रिज़र्व है. इसे Android एम्युलेटर से ऐक्सेस किया जा सकता है. ज़्यादा जानें.
FhirApplication
क्लास में, एफ़एचआईआर इंजन को लेज़ीली इंस्टैंशिएट करने के लिए यह लाइन जोड़ें:
इससे यह पक्का होता है कि FhirEngine इंस्टेंस सिर्फ़ तब बनाया जाए, जब उसे पहली बार ऐक्सेस किया गया हो, न कि ऐप्लिकेशन शुरू होने पर.private val fhirEngine: FhirEngine by lazy { FhirEngineProvider.getInstance(this) }
- अपने पूरे ऐप्लिकेशन को आसानी से ऐक्सेस करने के लिए,
FhirApplication
क्लास में सुविधा का यह तरीका जोड़ें:
इस स्टैटिक तरीके से, आपको कॉन्टेक्स्ट का इस्तेमाल करके ऐप्लिकेशन में कहीं से भी FHIR इंजन इंस्टेंस वापस लाने की सुविधा मिलती है.companion object { fun fhirEngine(context: Context) = (context.applicationContext as FhirApplication).fhirEngine }
5. FHIR सर्वर के साथ डेटा सिंक करना
- नई क्लास
DownloadWorkManagerImpl.kt
बनाएं. इस क्लास में, आपको यह तय करना होगा कि ऐप्लिकेशन, सूची में से अगले रिसॉर्स को डाउनलोड करने के लिए कैसे फ़ेच करेगा.:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस क्लास के पास संसाधनों की सूची है, जिसे वह डाउनलोड करना चाहता है. यह रिस्पॉन्स को प्रोसेस करता है और लौटाए गए बंडल से रिसॉर्स निकालता है, जो लोकल डेटाबेस में सेव हो जाते हैं.class DownloadWorkManagerImpl : DownloadWorkManager { private val urls = LinkedList(listOf("Patient")) override suspend fun getNextRequest(): DownloadRequest? { val url = urls.poll() ?: return null return DownloadRequest.of(url) } override suspend fun getSummaryRequestUrls() = mapOf<ResourceType, String>() override suspend fun processResponse(response: Resource): Collection<Resource> { var bundleCollection: Collection<Resource> = mutableListOf() if (response is Bundle && response.type == Bundle.BundleType.SEARCHSET) { bundleCollection = response.entry.map { it.resource } } return bundleCollection } }
- नई क्लास बनाएं
AppFhirSyncWorker.kt
यह क्लास तय करती है कि ऐप्लिकेशन, बैकग्राउंड वर्कर का इस्तेमाल करके रिमोट FHIR सर्वर से कैसे सिंक करेगा.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यहां, हमने बताया है कि सिंक करने के लिए किस डाउनलोड मैनेजर, कॉन्फ़्लिक्ट रिज़ॉल्वर, और FHIR इंजन इंस्टेंस का इस्तेमाल करना है.class AppFhirSyncWorker(appContext: Context, workerParams: WorkerParameters) : FhirSyncWorker(appContext, workerParams) { override fun getDownloadWorkManager() = DownloadWorkManagerImpl() override fun getConflictResolver() = AcceptLocalConflictResolver override fun getFhirEngine() = FhirApplication.fhirEngine(applicationContext) }
- अपने ViewModel
PatientListViewModel.kt
में, आपको एक बार इस्तेमाल किए जाने वाले सिंक मैकेनिज़्म को सेट अप करना होगा. यह कोड ढूंढें और उसेtriggerOneTimeSync()
फ़ंक्शन में जोड़ें:
यह कोरूटीन, उस AppFhirSyncWorker का इस्तेमाल करके FHIR सर्वर के साथ एक बार सिंक शुरू करता है जिसे हमने पहले बताया था. इसके बाद, वह सिंक की स्थिति के आधार पर यूज़र इंटरफ़ेस (यूआई) को अपडेट करेगा.viewModelScope.launch { Sync.oneTimeSync<AppFhirSyncWorker>(getApplication()) .shareIn(this, SharingStarted.Eagerly, 10) .collect { _pollState.emit(it) } }
PatientListFragment.kt
फ़ाइल में,handleSyncJobStatus
फ़ंक्शन का मुख्य हिस्सा अपडेट करें:
यहां सिंक की प्रोसेस पूरी होने के बाद, उपयोगकर्ता को इसकी सूचना देने वाला एक टोस्ट मैसेज दिखेगा. इसके बाद, ऐप्लिकेशन सभी मरीज़ों के नाम को बिना किसी शब्द के खोजने के ज़रिए दिखाएगा.when (syncJobStatus) { is SyncJobStatus.Finished -> { Toast.makeText(requireContext(), "Sync Finished", Toast.LENGTH_SHORT).show() viewModel.searchPatientsByName("") } else -> {} }
सब कुछ सेट अप हो गया है. अब अपना ऐप्लिकेशन चलाएं. मेन्यू में Sync
बटन पर क्लिक करें. अगर सब कुछ ठीक से काम करता है, तो आपको अपने लोकल FHIR सर्वर से मरीज़ों को ऐप्लिकेशन में डाउनलोड होते हुए देखना चाहिए.
6. मरीज़ के डेटा में बदलाव करें और उसे अपलोड करें
इस सेक्शन में, हम आपको चुनिंदा शर्तों के हिसाब से मरीज़ के डेटा में बदलाव करने का तरीका बताएंगे. साथ ही, अपडेट किया गया डेटा आपके एफ़एचआईआर सर्वर पर अपलोड करने का तरीका बताएंगे. खास तौर पर, हम Wakefield
और Taunton
में रहने वाले मरीज़ों के शहरों के पते बदल देंगे.
पहला चरण: PatientListViewModel में बदलाव वाला लॉजिक सेट अप करना
इस सेक्शन का कोड PatientListViewModel
के triggerUpdate
फ़ंक्शन में जोड़ दिया गया है
- FHIR इंजन को ऐक्सेस करें:
PatientListViewModel.kt
में FHIR इंजन का रेफ़रंस लेते हुए शुरुआत करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह कोड, ViewModel के स्कोप में एक कोरूटीन लॉन्च करता है और एफ़एचआईआर इंजन को शुरू करता है.viewModelScope.launch { val fhirEngine = FhirApplication.fhirEngine(getApplication())
- वेकफ़ील्ड से मरीज़ों को खोजें:
Wakefield
के पते वाले मरीज़ों को खोजने के लिए एफ़एचआईआर इंजन का इस्तेमाल करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यहां, मरीज़ों को उनके पते के शहर के हिसाब से फ़िल्टर करने के लिए, एफ़एचआईआर इंजन केval patientsFromWakefield = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Wakefield" } ) }
search
तरीके का इस्तेमाल किया जाता है. इस नतीजे में, वेकफ़ील्ड के मरीज़ों की सूची शामिल की जाएगी. - टॉन्टन के मरीज़ों को खोजें:इसी तरह, ऐसे मरीज़ खोजें जिनका पता
Taunton
है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अब हमारे पास मरीज़ों की दो सूची हैं - एक वेकफ़ील्ड से और दूसरी टॉन्टन से.val patientsFromTaunton = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Taunton" } ) }
- बीमारी के पते में बदलाव करें:
patientsFromWakefield
सूची में दिए गए हर मरीज़ के बारे में देखें, उसके शहर का नाम बदलकरTaunton
करें, और एफ़एचआईआर इंजन में उसकी जानकारी अपडेट करें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इसी तरह,patientsFromWakefield.forEach { it.resource.address.first().city = "Taunton" fhirEngine.update(it.resource) }
patientsFromTaunton
सूची में मौजूद हर मरीज़ के नाम को अपडेट करें, ताकि उसके शहर का नाम बदलकरWakefield
हो जाए.patientsFromTaunton.forEach { it.resource.address.first().city = "Wakefield" fhirEngine.update(it.resource) }
- सिंक्रोनाइज़ेशन शुरू करें:डेटा में स्थानीय तौर पर बदलाव करने के बाद, डेटा को एक बार सिंक करें. इससे यह पक्का किया जा सकेगा कि एफ़एचआईआर सर्वर पर डेटा अपडेट हो.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है क्लोज़िंग ब्रैकेटtriggerOneTimeSync() }
}
से यह पता चलता है कि शुरुआत में लॉन्च किए गए कोरूटीन की समयसीमा खत्म हो रही है.
दूसरा चरण: सुविधाओं की जांच करना
- यूज़र इंटरफ़ेस (यूआई) की जांच:अपना ऐप्लिकेशन चलाएं. मेन्यू में
Update
बटन पर क्लिक करें. आपको यह दिखना चाहिए कि मरीज़Aaron697
औरAbby752
की अदला-बदली करने वाले मरीज़ों का पता शहर का है. - सर्वर की पुष्टि:कोई ब्राउज़र खोलें और
http://localhost:8080/fhir/Patient/
पर जाएं. पुष्टि करें किAaron697
औरAbby752
के मरीज़ों के पते की जानकारी, स्थानीय एफ़एचआईआर सर्वर पर अपडेट है.
यह तरीका अपनाकर, आपने मरीज़ों के डेटा में बदलाव करने और उन्हें अपने एफ़एचआईआर सर्वर के साथ सिंक करने का तरीका लागू कर लिया है.
7. मरीज़ों को नाम से खोजें
मरीज़ों को उनके नाम से खोजने की सुविधा, यूज़र-फ़्रेंडली तरीके से जानकारी हासिल करने में मदद कर सकती है. यहां हम आपको अपने ऐप्लिकेशन में इस सुविधा को लागू करने की प्रक्रिया के बारे में बताएंगे.
पहला चरण: फ़ंक्शन सिग्नेचर अपडेट करें
अपनी PatientListViewModel.kt
फ़ाइल पर जाएं और searchPatientsByName
नाम का फ़ंक्शन ढूंढें. हम इस फ़ंक्शन में कोड जोड़ेंगे.
नाम वाली क्वेरी के आधार पर नतीजों को फ़िल्टर करने और यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के नतीजे भेजने के लिए, शर्तों के साथ कोड ब्लॉक करें. यह नीचे दिया गया है:
viewModelScope.launch {
val fhirEngine = FhirApplication.fhirEngine(getApplication())
if (nameQuery.isNotEmpty()) {
val searchResult = fhirEngine.search<Patient> {
filter(
Patient.NAME,
{
modifier = StringFilterModifier.CONTAINS
value = nameQuery
},
)
}
liveSearchedPatients.value = searchResult.map { it.resource }
}
}
यहां, अगर nameQuery
खाली नहीं है, तो खोज फ़ंक्शन, नतीजों को फ़िल्टर करके सिर्फ़ उन मरीज़ों को शामिल करेगा जिनके नाम में पहले से क्वेरी शामिल है.
दूसरा चरण: खोज से जुड़े नए फ़ंक्शन की जांच करना
- ऐप्लिकेशन को फिर से लॉन्च करें:ये बदलाव करने के बाद, अपने ऐप्लिकेशन को फिर से बनाएं और चलाएं.
- मरीज़ खोजें: मरीज़ की सूची वाली स्क्रीन पर, खोजने की सुविधा का इस्तेमाल करें. इसके बाद, मरीज़ों की सूची को फ़िल्टर करने के लिए कोई नाम (या नाम का कोई हिस्सा) डाला जा सकता है.
इन चरणों को पूरा करने के बाद, आपने लोगों को बेहतर तरीके से यह सुविधा दे दी है कि वे मरीज़ों को उनके नाम से खोज सकते हैं. इससे उपयोगकर्ता अनुभव और डेटा वापस पाने की क्षमता काफ़ी बेहतर हो सकती है.
8. बधाई हो!
आपने अपने ऐप्लिकेशन में FHIR के संसाधनों को मैनेज करने के लिए, FHIR इंजन लाइब्रेरी का इस्तेमाल किया है:
- FHIR के संसाधनों को FHIR सर्वर के साथ सिंक करने के लिए, Sync API का इस्तेमाल करें
- लोकल एफ़एचआईआर संसाधनों को बनाने, पढ़ने, अपडेट करने, और मिटाने के लिए Data Access API का इस्तेमाल करें
- स्थानीय एफ़एचआईआर संसाधनों को खोजने के लिए, Search API का इस्तेमाल करें
हमने इन विषयों के बारे में बताया
- लोकल HAPI FHIR सर्वर को सेट अप करने का तरीका
- स्थानीय HAPI FHIR सर्वर पर टेस्ट डेटा कैसे अपलोड करें
- FHIR इंजन लाइब्रेरी का इस्तेमाल करके Android ऐप्लिकेशन बनाने का तरीका
- FHIR इंजन लाइब्रेरी में सिंक एपीआई, Data Access API, और Search API को इस्तेमाल करने का तरीका
अगले चरण
- एफ़एचआईआर इंजन लाइब्रेरी के दस्तावेज़ देखें
- Search API की बेहतर सुविधाओं के बारे में जानें
- अपने Android ऐप्लिकेशन में FHIR इंजन लाइब्रेरी का इस्तेमाल करें