1. Başlamadan önce
Ne oluşturacaksınız?
Bu codelab'de, FHIR Engine Library'yi kullanarak bir Android uygulaması oluşturacaksınız. Uygulamanız, FHIR sunucusundan FHIR kaynaklarını indirmek ve yerel değişiklikleri sunucuya yüklemek için FHIR Motoru Kitaplığı'nı kullanır.
Neler öğreneceksiniz?
- Docker kullanarak yerel bir HAPI FHIR sunucusu oluşturma
- FHIR Motoru Kitaplığı'nı Android uygulamanıza entegre etme
- FHIR kaynaklarını indirip yüklemek için tek seferlik veya dönemsel bir iş oluşturmak üzere Senkronizasyon API'sini kullanma
- Search API'yi kullanma
- FHIR kaynaklarını yerel olarak oluşturmak, okumak, güncellemek ve silmek için Veri Erişimi API'lerini kullanma
İhtiyacınız olanlar
- Docker (Docker'ı edinin)
- Android Studio'nun (4.1.2 ve sonraki sürümler) son sürümü
- Android Emulator veya Android 7.0 Nougat ya da sonraki bir sürümü çalıştıran fiziksel bir Android cihaz
- Örnek kod
- Kotlin'de Android geliştirmeyle ilgili temel bilgiler
Daha önce Android uygulaması geliştirmediyseniz ilk uygulamanızı oluşturarak başlayabilirsiniz.
2. Test verileriyle yerel bir HAPI FHIR sunucusu oluşturma
HAPI FHIR, popüler bir açık kaynak FHIR sunucusudur. Android uygulamasının bağlanacağı yerel bir HAPI FHIR sunucusu kullanıyoruz.
Yerel HAPI FHIR sunucusunu ayarlama
- HAPI FHIR'ın en son görüntüsünü almak için terminalde aşağıdaki komutu çalıştırın
docker pull hapiproject/hapi:latest - Daha önce indirilen
hapiproject/hapigörüntüsünü çalıştırmak için Docker Desktop'u kullanarak veya aşağıdaki komutu çalıştırarak bir HAPI FHIR kapsayıcısı oluşturun. Daha fazla bilgi edinin.docker run -p 8080:8080 hapiproject/hapi:latest http://localhost:8080/URL'sini bir tarayıcıda açarak sunucuyu inceleyin. HAPI FHIR web arayüzünü görürsünüz.
Yerel HAPI FHIR sunucusunu test verileriyle doldurma
Uygulamamızı test etmek için sunucuda bazı test verilerine ihtiyacımız var. Synthea tarafından oluşturulan sentetik verileri kullanacağız.
- Öncelikle synthea-samples adresinden örnek verileri indirmemiz gerekiyor.
synthea_sample_data_fhir_r4_sep2019.zipdosyasını indirip çıkarın. Sıkıştırılmamış örnek verilerde, her biri tek bir hastaya ait işlem paketi olan çok sayıda.jsondosyası bulunur. - Yerel HAPI FHIR sunucusuna üç hastanın test verilerini yükleyeceğiz. JSON dosyalarını içeren dizinde aşağıdaki komutu çalıştırın
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/ - Tüm hastaların test verilerini sunucuya yüklemek için
Ancak bu işlemin tamamlanması uzun sürebilir ve codelab için gerekli değildir.for f in *.json; do curl -X POST -H "Content-Type: application/json" -d @$f http://localhost:8080/fhir/ ; done - Bir tarayıcıda
http://localhost:8080/fhir/Patient/URL'sini açarak test verilerinin sunucuda mevcut olduğunu doğrulayın. Arama sonucu olaraktotalsayıyla birlikteHTTP 200 OKmetnini ve FHIR paketinde hasta verilerini içeren sayfanınResponse Bodybölümünü görürsünüz.
3. Android uygulamasını ayarlama
Kodu indirme
Bu kod alanının kodunu indirmek için Android FHIR SDK deposunu klonlayın: git clone https://github.com/google/android-fhir.git
Bu codelab'in başlangıç projesi codelabs/engine adresindedir.
Uygulamayı Android Studio'ya aktarma
Başlatıcı uygulamayı Android Studio'ya içe aktararak başlıyoruz.
Android Studio'yu açın, Projeyi İçe Aktar (Gradle, Eclipse ADT vb.)'ı seçin ve daha önce indirdiğiniz kaynak koddaki codelabs/engine/ klasörünü seçin.

Projenizi Gradle dosyalarıyla senkronize etme
Size kolaylık sağlamak için FHIR Engine Library bağımlılıkları projeye eklenmiştir. Bu sayede FHIR Engine Library'yi uygulamanıza entegre edebilirsiniz. Projenizin app/build.gradle.kts dosyasının sonundaki aşağıdaki satırlara bakın:
dependencies {
// ...
implementation("com.google.android.fhir:engine:1.1.0")
}
Tüm bağımlılıkların uygulamanızda kullanılabildiğinden emin olmak için bu noktada projenizi gradle dosyalarıyla senkronize etmeniz gerekir.
Android Studio araç çubuğundan Projeyi Gradle Dosyalarıyla Senkronize Et'i (
) seçin. Bağımlılıkların düzgün çalışıp çalışmadığını kontrol etmek için uygulamayı tekrar da çalıştırabilirsiniz.
Başlangıç uygulamasını çalıştırma
Projeyi Android Studio'ya içe aktardığınıza göre uygulamayı ilk kez çalıştırmaya hazırsınız.
Android Studio emülatörünü başlatın ve Android Studio araç çubuğunda Çalıştır'ı (
) tıklayın.

4. FHIR Engine örneği oluşturma
FHIR Engine'ı Android uygulamanıza dahil etmek için FHIR Engine kitaplığını kullanmanız ve FHIR Engine örneğini başlatmanız gerekir. Aşağıda açıklanan adımlar, işlem boyunca size yol gösterecektir.
- Uygulama sınıfınıza gidin. Bu örnekte,
app/src/main/java/com/google/android/fhir/codelabs/enginekonumundakiFhirApplication.ktsınıfı gösterilmektedir. - FHIR motorunu başlatmak için
onCreate()yönteminin içine aşağıdaki kodu ekleyin: Notlar: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: Cihaz destekliyorsa veri şifrelemeyi etkinleştirir.RECREATE_AT_OPEN: Veritabanı hata stratejisini belirler. Bu durumda, açılırken hata oluşursa veritabanı yeniden oluşturulur.ServerConfigurationadresindekibaseUrl: Bu, FHIR sunucusunun temel URL'sidir. Sağlanan10.0.2.2IP adresi, Android emülatöründen erişilebilen localhost için özel olarak ayrılmıştır. Daha fazla bilgi edinin.
FhirApplicationsınıfına, FHIR motorunu tembel şekilde başlatmak için aşağıdaki satırı ekleyin: Bu, FhirEngine örneğinin yalnızca uygulama başladığında değil, yalnızca ilk kez erişildiğinde oluşturulmasını sağlar.private val fhirEngine: FhirEngine by lazy { FhirEngineProvider.getInstance(this) }- Uygulamanızda daha kolay erişim için
FhirApplicationsınıfına aşağıdaki kolaylık yöntemini ekleyin: Bu statik yöntem, bağlamı kullanarak FHIR Engine örneğini uygulamanın herhangi bir yerinden almanıza olanak tanır.companion object { fun fhirEngine(context: Context) = (context.applicationContext as FhirApplication).fhirEngine }
5. Verileri FHIR sunucusuyla senkronize etme
- Yeni bir sınıf oluşturun
DownloadWorkManagerImpl.kt. Bu sınıfta, uygulamanın indirmek üzere listedeki bir sonraki kaynağı nasıl getireceğini tanımlayacaksınız: Bu sınıfta, indirmek istediği bir kaynak türü sırası vardır. Yanıtları işler ve döndürülen paketten kaynakları ayıklayarak yerel veritabanına kaydeder.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 } } - Yeni bir sınıf oluşturun
AppFhirSyncWorker.ktBu sınıf, uygulamanın arka plan çalışanı kullanarak uzak FHIR sunucusuyla nasıl senkronize edileceğini tanımlar. Burada, senkronizasyon için kullanılacak indirme yöneticisini, çakışma çözücüyü ve FHIR motoru örneğini tanımladık.class AppFhirSyncWorker(appContext: Context, workerParams: WorkerParameters) : FhirSyncWorker(appContext, workerParams) { override fun getDownloadWorkManager() = DownloadWorkManagerImpl() override fun getConflictResolver() = AcceptLocalConflictResolver override fun getFhirEngine() = FhirApplication.fhirEngine(applicationContext) override fun getUploadStrategy() = UploadStrategy.forBundleRequest( methodForCreate = HttpCreateMethod.PUT, methodForUpdate = HttpUpdateMethod.PATCH, squash = true, bundleSize = 500, ) } PatientListViewModel.ktViewModel'inizde tek seferlik bir senkronizasyon mekanizması oluşturursunuz. Aşağıdaki kodu buluptriggerOneTimeSync()işlevine ekleyin: Bu coroutine, daha önce tanımladığımız AppFhirSyncWorker'ı kullanarak FHIR sunucusuyla tek seferlik bir senkronizasyon başlatır. Ardından, kullanıcı arayüzünü senkronizasyon işleminin durumuna göre günceller.viewModelScope.launch { Sync.oneTimeSync<AppFhirSyncWorker>(getApplication()) .shareIn(this, SharingStarted.Eagerly, 10) .collect { _pollState.emit(it) } }PatientListFragment.ktdosyasındahandleSyncJobStatusişlevinin gövdesini güncelleyin: Senkronizasyon işlemi tamamlandığında kullanıcıyı bilgilendiren bir pop-up mesaj gösterilir ve uygulama, boş bir adla arama yaparak tüm hastaları gösterir.when (syncJobStatus) { is SyncJobStatus.Finished -> { Toast.makeText(requireContext(), "Sync Finished", Toast.LENGTH_SHORT).show() viewModel.searchPatientsByName("") } else -> {} }
Artık her şey ayarlandığına göre uygulamanızı çalıştırın. Menüdeki Sync düğmesini tıklayın. Her şey doğru çalışırsa yerel FHIR sunucunuzdaki hastaların indirilip uygulamada gösterildiğini görürsünüz.

6. Hasta verilerini değiştirme ve yükleme
Bu bölümde, hasta verilerini belirli ölçütlere göre değiştirme ve güncellenmiş verileri FHIR sunucunuza yükleme sürecinde size yol göstereceğiz. Daha açık belirtmek gerekirse, Wakefield ve Taunton'da ikamet eden hastaların adres şehirlerini değiştireceğiz.
1. adım: PatientListViewModel'de Değişiklik Mantığını Ayarlayın
Bu bölümdeki kod, PatientListViewModel içindeki triggerUpdate işlevine eklenir.
- FHIR motoruna erişme:
PatientListViewModel.ktiçinde FHIR motoruna referans alarak başlayın. Bu kod, ViewModel'in kapsamında bir işleyici başlatır ve FHIR motorunu başlatır.viewModelScope.launch { val fhirEngine = FhirApplication.fhirEngine(getApplication()) - Wakefield'den hasta arama:Adres şehri
Wakefieldolan hastaları aramak için FHIR motorunu kullanın. Burada, hastaları adres şehirlerine göre filtrelemek için FHIR motorununval patientsFromWakefield = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Wakefield" } ) }searchyöntemini kullanıyoruz. Sonuç, Wakefield'deki hastaların listesi olur. - Taunton'dan hasta arama:Benzer şekilde, adres şehri
Tauntonolan hastaları arayın. Artık birinde Wakefield, diğerinde Taunton'dan hastaların bulunduğu iki listemiz var.val patientsFromTaunton = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Taunton" } ) } - Hasta adreslerini değiştirme:
patientsFromWakefieldlistesindeki her hastanın şehriniTauntonolarak değiştirin ve FHIR motorunda güncelleyin. Benzer şekilde,patientsFromWakefield.forEach { it.resource.address.first().city = "Taunton" fhirEngine.update(it.resource) }patientsFromTauntonlistesindeki her hastanın şehriniWakefieldolarak değiştirin.patientsFromTaunton.forEach { it.resource.address.first().city = "Wakefield" fhirEngine.update(it.resource) } - Senkronizasyonu başlatın:Verileri yerel olarak değiştirdikten sonra, verilerin FHIR sunucusunda güncellendiğinden emin olmak için bir defalık senkronizasyon tetikleyin.
Kapanış parantezitriggerOneTimeSync() }}, başlangıçta başlatılan coroutine'un sonunu belirtir.
2. Adım: İşlevi test edin
- Kullanıcı Arayüzü Testi:Uygulamanızı çalıştırın. Menüdeki
Updatedüğmesini tıklayın.Aaron697veAbby752hastalarının adres şehirlerinin yer değiştirdiğini görürsünüz. - Sunucu Doğrulaması:Bir tarayıcı açıp
http://localhost:8080/fhir/Patient/adresine gidin.Aaron697veAbby752hastalarının adres şehrinin yerel FHIR sunucusunda güncellendiğini doğrulayın.
Bu adımları uygulayarak hasta verilerini değiştirmek ve değişiklikleri FHIR sunucunuzla senkronize etmek için bir mekanizmayı başarıyla uyguladınız.
7. Hastaları ada göre arama
Hastaları adlarına göre aramak, kullanıcı dostu bir bilgi alma yöntemi olabilir. Bu makalede, bu özelliği uygulamanıza uygulama sürecinde size yol göstereceğiz.
1. Adım: İşlev İmzasını Güncelleyin
PatientListViewModel.kt dosyanıza gidin ve searchPatientsByName adlı işlevi bulun. Bu işleve kod ekleyeceğiz.
Sonuçları, sağlanan ad sorgusuna göre filtrelemek ve kullanıcı arayüzünün güncellemesi için sonuçları yayınlamak üzere aşağıdaki koşullu kod bloğunu ekleyin:
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 }
}
}
Burada, nameQuery boş değilse arama işlevi sonuçları yalnızca adlarında belirtilen sorguyu içeren hastaları içerecek şekilde filtreler.
2. Adım: Yeni arama işlevini test edin
- Uygulamayı yeniden başlatın:Bu değişiklikleri yaptıktan sonra uygulamanızı yeniden oluşturup çalıştırın.
- Hasta arama: Hasta listesi ekranında arama işlevini kullanın. Artık hasta listesini buna göre filtrelemek için bir ad (veya adın bir kısmını) girebilirsiniz.
Bu adımları tamamladığınızda, kullanıcılara hastaları adlarına göre verimli bir şekilde arama olanağı sunarak uygulamanızı geliştirmiş olursunuz. Bu, kullanıcı deneyimini ve veri alma verimliliğini önemli ölçüde artırabilir.
8. Tebrikler!
Uygulamanızdaki FHIR kaynaklarını yönetmek için FHIR Engine kitaplığını kullandıysanız:
- FHIR kaynaklarını bir FHIR sunucusuyla senkronize etmek için Sync API'yi kullanma
- Yerel FHIR kaynaklarını oluşturmak, okumak, güncellemek ve silmek için Veri Erişimi API'sini kullanma
- Yerel FHIR kaynaklarını aramak için Search API'yi kullanma
İşlediğimiz konular
- Yerel HAPI FHIR sunucusu oluşturma
- Test verilerini yerel HAPI FHIR sunucusuna yükleme
- FHIR Engine kitaplığını kullanarak Android uygulaması oluşturma
- FHIR Motoru Kitaplığı'nda Sync API, Veri Erişimi API'si ve Arama API'si nasıl kullanılır?
Sonraki Adımlar
- FHIR Engine Library ile ilgili belgeleri keşfedin
- Search API'nin gelişmiş özelliklerini keşfetme
- FHIR Engine kitaplığını kendi Android uygulamanıza uygulama