1. Sebelum memulai
Yang akan Anda build
Dalam codelab ini, Anda akan mem-build aplikasi Android menggunakan Library FHIR Engine. Aplikasi Anda akan menggunakan Library FHIR Engine untuk mendownload resource FHIR dari server FHIR, dan mengupload perubahan lokal apa pun ke server.
Yang akan Anda pelajari
- Cara membuat server HAPI FHIR lokal menggunakan Docker
- Cara mengintegrasikan FHIR Engine Library ke dalam aplikasi Android
- Cara menggunakan Sync API untuk menyiapkan tugas satu kali atau berkala guna mendownload dan mengupload resource FHIR
- Cara menggunakan Search API
- Cara menggunakan Data Access API untuk membuat, membaca, memperbarui, dan menghapus resource FHIR secara lokal
Yang Anda butuhkan
- Docker (mendapatkan Docker)
- Versi terbaru Android Studio (v4.1.2+)
- Android Emulator atau perangkat Android fisik yang menjalankan Android 7.0 Nougat atau yang lebih baru
- Kode contoh
- Pengetahuan dasar tentang pengembangan Android di Kotlin
Jika belum pernah mem-build aplikasi Android, Anda dapat memulai dengan mem-build aplikasi pertama Anda.
2. Menyiapkan server HAPI FHIR lokal dengan data pengujian
HAPI FHIR adalah server FHIR open source yang populer. Kita menggunakan server HAPI FHIR lokal di codelab untuk dihubungkan ke aplikasi Android.
Menyiapkan server HAPI FHIR lokal
- Jalankan perintah berikut di terminal untuk mendapatkan image HAPI FHIR terbaru
docker pull hapiproject/hapi:latest
- Buat penampung HAPI FHIR menggunakan Docker Desktop untuk menjalankan image
hapiproject/hapi
yang didownload sebelumnya, atau jalankan perintah berikut Pelajari lebih lanjut.docker run -p 8080:8080 hapiproject/hapi:latest
- Periksa server dengan membuka URL
http://localhost:8080/
di browser. Anda akan melihat antarmuka web HAPI FHIR.
Mengisi server HAPI FHIR lokal dengan data pengujian
Untuk menguji aplikasi, kita memerlukan beberapa data pengujian di server. Kita akan menggunakan data sintetis yang dihasilkan oleh Synthea.
- Pertama, kita perlu mendownload data contoh dari synthea-samples. Download dan ekstrak
synthea_sample_data_fhir_r4_sep2019.zip
. Data contoh yang tidak diekstrak memiliki banyak file.json
, yang masing-masing merupakan paket transaksi untuk setiap pasien. - Kita akan mengupload data pengujian untuk tiga pasien ke server HAPI FHIR lokal. Jalankan perintah berikut di direktori yang berisi file 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/
- Untuk mengupload data pengujian untuk semua pasien ke server, jalankan
Namun, proses ini dapat memerlukan waktu yang lama untuk diselesaikan dan tidak diperlukan untuk codelab.for f in *.json; do curl -X POST -H "Content-Type: application/json" -d @$f http://localhost:8080/fhir/ ; done
- Verifikasi bahwa data pengujian tersedia di server dengan membuka URL
http://localhost:8080/fhir/Patient/
di browser. Anda akan melihat teksHTTP 200 OK
dan bagianResponse Body
di halaman yang berisi data pasien dalam FHIR Bundle sebagai hasil penelusuran dengan jumlahtotal
.
3. Menyiapkan aplikasi Android
Mendownload Kode
Untuk mendownload kode untuk codelab ini, clone repositori Android FHIR SDK: git clone https://github.com/google/android-fhir.git
Project awal untuk codelab ini terletak di codelabs/engine
.
Mengimpor aplikasi ke Android Studio
Kita mulai dengan mengimpor aplikasi awal ke Android Studio.
Buka Android Studio, pilih Import Project (Gradle, Eclipse ADT, etc.), lalu pilih folder codelabs/engine/
dari kode sumber yang telah Anda download sebelumnya.
Menyinkronkan project dengan file Gradle
Untuk memudahkan Anda, dependensi Library Mesin FHIR telah ditambahkan ke project. Hal ini memungkinkan Anda mengintegrasikan Library FHIR Engine di aplikasi. Amati baris berikut hingga akhir file app/build.gradle.kts
project Anda:
dependencies {
// ...
implementation("com.google.android.fhir:engine:1.1.0")
}
Untuk memastikan semua dependensi tersedia untuk aplikasi, Anda harus menyinkronkan project dengan file gradle pada tahap ini.
Pilih Sync Project with Gradle Files () dari toolbar Android Studio. Anda juga dapat menjalankan aplikasi lagi untuk memeriksa apakah dependensi berfungsi dengan benar.
Menjalankan aplikasi awal
Setelah mengimpor project ke Android Studio, Anda siap menjalankan aplikasi untuk pertama kalinya.
Mulai emulator Android Studio, lalu klik Run () di toolbar Android Studio.
4. Membuat instance FHIR Engine
Untuk menggabungkan FHIR Engine ke dalam aplikasi Android, Anda harus menggunakan Library FHIR Engine dan memulai instance FHIR Engine. Langkah-langkah yang diuraikan di bawah ini akan memandu Anda menyelesaikan prosesnya.
- Buka class Aplikasi Anda, yang dalam contoh ini adalah
FhirApplication.kt
, yang terletak diapp/src/main/java/com/google/android/fhir/codelabs/engine
. - Di dalam metode
onCreate()
, tambahkan kode berikut untuk melakukan inisialisasi FHIR Engine: Catatan: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
: Mengaktifkan enkripsi data jika perangkat mendukungnya.RECREATE_AT_OPEN
: Menentukan strategi error database. Dalam hal ini, database akan dibuat ulang jika terjadi error saat dibuka.baseUrl
diServerConfiguration
: Ini adalah URL dasar server FHIR. Alamat IP yang diberikan10.0.2.2
dicadangkan khusus untuk localhost, yang dapat diakses dari emulator Android. Pelajari lebih lanjut.
- Di class
FhirApplication
, tambahkan baris berikut untuk membuat instance FHIR Engine secara lambat: Tindakan ini memastikan instance FhirEngine hanya dibuat saat diakses untuk pertama kalinya, bukan langsung saat aplikasi dimulai.private val fhirEngine: FhirEngine by lazy { FhirEngineProvider.getInstance(this) }
- Tambahkan metode praktis berikut di class
FhirApplication
untuk akses yang lebih mudah di seluruh aplikasi Anda: Metode statis ini memungkinkan Anda mengambil instance FHIR Engine dari mana saja di aplikasi menggunakan konteks.companion object { fun fhirEngine(context: Context) = (context.applicationContext as FhirApplication).fhirEngine }
5. Menyinkronkan data dengan server FHIR
- Buat class baru
DownloadWorkManagerImpl.kt
. Di class ini, Anda akan menentukan cara aplikasi mengambil resource berikutnya dari daftar yang akan didownload.: Class ini memiliki antrean jenis resource yang ingin didownload. Class ini memproses respons dan mengekstrak resource dari paket yang ditampilkan, yang disimpan ke dalam database lokal.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 } }
- Buat class baru
AppFhirSyncWorker.kt
Class ini menentukan cara aplikasi akan disinkronkan dengan server FHIR jarak jauh menggunakan pekerja latar belakang. Di sini, kita telah menentukan pengelola download, pemecah konflik, dan instance mesin FHIR yang akan digunakan untuk sinkronisasi.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, ) }
- Di ViewModel,
PatientListViewModel.kt
, Anda akan menyiapkan mekanisme sinkronisasi satu kali. Cari dan tambahkan kode ini ke fungsitriggerOneTimeSync()
: Coroutine ini memulai sinkronisasi satu kali dengan server FHIR menggunakan AppFhirSyncWorker yang telah kita tentukan sebelumnya. Kemudian, UI akan diperbarui berdasarkan status proses sinkronisasi.viewModelScope.launch { Sync.oneTimeSync<AppFhirSyncWorker>(getApplication()) .shareIn(this, SharingStarted.Eagerly, 10) .collect { _pollState.emit(it) } }
- Di file
PatientListFragment.kt
, perbarui isi fungsihandleSyncJobStatus
: Di sini, saat proses sinkronisasi selesai, pesan toast akan ditampilkan untuk memberi tahu pengguna, dan aplikasi akan menampilkan semua pasien dengan memanggil penelusuran dengan nama kosong.when (syncJobStatus) { is SyncJobStatus.Finished -> { Toast.makeText(requireContext(), "Sync Finished", Toast.LENGTH_SHORT).show() viewModel.searchPatientsByName("") } else -> {} }
Setelah semuanya disiapkan, jalankan aplikasi Anda. Klik tombol Sync
di menu. Jika semuanya berfungsi dengan benar, Anda akan melihat pasien dari server FHIR lokal didownload dan ditampilkan di aplikasi.
6. Mengubah dan Mengupload Data Pasien
Di bagian ini, kami akan memandu Anda melalui proses mengubah data pasien berdasarkan kriteria tertentu dan mengupload data yang diperbarui ke server FHIR Anda. Secara khusus, kami akan menukar kota alamat untuk pasien yang tinggal di Wakefield
dan Taunton
.
Langkah 1: Menyiapkan Logika Modifikasi di PatientListViewModel
Kode di bagian ini ditambahkan ke fungsi triggerUpdate
di PatientListViewModel
- Mengakses Mesin FHIR:Mulailah dengan mendapatkan referensi ke mesin FHIR di
PatientListViewModel.kt
. Kode ini meluncurkan coroutine dalam cakupan ViewModel dan melakukan inisialisasi mesin FHIR.viewModelScope.launch { val fhirEngine = FhirApplication.fhirEngine(getApplication())
- Menelusuri Pasien dari Wakefield:Gunakan mesin FHIR untuk menelusuri pasien dengan kota alamat
Wakefield
. Di sini, kita menggunakan metodeval patientsFromWakefield = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Wakefield" } ) }
search
mesin FHIR untuk memfilter pasien berdasarkan kota alamat mereka. Hasilnya akan berupa daftar pasien dari Wakefield. - Telusuri Pasien dari Taunton:Demikian pula, telusuri pasien dengan kota alamat
Taunton
. Sekarang kita memiliki dua daftar pasien - satu dari Wakefield dan satu lagi dari Taunton.val patientsFromTaunton = fhirEngine.search<Patient> { filter( Patient.ADDRESS_CITY, { modifier = StringFilterModifier.MATCHES_EXACTLY value = "Taunton" } ) }
- Ubah Alamat Pasien:Lihat setiap pasien dalam daftar
patientsFromWakefield
, ubah kota mereka menjadiTaunton
, dan perbarui di mesin FHIR. Demikian pula, perbarui setiap pasien dalam daftarpatientsFromWakefield.forEach { it.resource.address.first().city = "Taunton" fhirEngine.update(it.resource) }
patientsFromTaunton
agar kota mereka diubah menjadiWakefield
.patientsFromTaunton.forEach { it.resource.address.first().city = "Wakefield" fhirEngine.update(it.resource) }
- Mulai Sinkronisasi:Setelah mengubah data secara lokal, picu sinkronisasi satu kali untuk memastikan data diperbarui di server FHIR.
Kurung kurawal penutuptriggerOneTimeSync() }
}
menandakan akhir coroutine yang diluncurkan di awal.
Langkah 2: Uji Fungsi
- Pengujian UI:Jalankan aplikasi Anda. Klik tombol
Update
di menu. Anda akan melihat kota alamat untuk pasienAaron697
danAbby752
ditukar. - Verifikasi Server:Buka browser dan buka
http://localhost:8080/fhir/Patient/
. Pastikan kota alamat untuk pasienAaron697
danAbby752
diperbarui di server FHIR lokal.
Dengan mengikuti langkah-langkah ini, Anda telah berhasil menerapkan mekanisme untuk mengubah data pasien dan menyinkronkan perubahan dengan server FHIR.
7. Menelusuri Pasien menurut Nama
Menelusuri pasien berdasarkan namanya dapat memberikan cara pengambilan informasi yang mudah digunakan. Di sini, kami akan memandu Anda melalui proses penerapan fitur ini di aplikasi Anda.
Langkah 1: Perbarui Tanda Tangan Fungsi
Buka file PatientListViewModel.kt
dan temukan fungsi bernama searchPatientsByName
. Kita akan menambahkan kode ke dalam fungsi ini.
Untuk memfilter hasil berdasarkan kueri nama yang diberikan, dan menampilkan hasil untuk diperbarui UI, sertakan blok kode bersyarat berikut:
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 }
}
}
Di sini, jika nameQuery
tidak kosong, fungsi penelusuran akan memfilter hasil untuk hanya menyertakan pasien yang namanya berisi kueri yang ditentukan.
Langkah 2: Menguji Fungsi Penelusuran Baru
- Luncurkan kembali Aplikasi:Setelah melakukan perubahan ini, build ulang dan jalankan aplikasi Anda.
- Telusuri Pasien: Di layar daftar pasien, gunakan fungsi penelusuran. Sekarang Anda dapat memasukkan nama (atau bagian dari nama) untuk memfilter daftar pasien yang sesuai.
Setelah menyelesaikan langkah-langkah ini, Anda telah meningkatkan aplikasi dengan memberi pengguna kemampuan untuk menelusuri pasien secara efisien berdasarkan nama mereka. Hal ini dapat meningkatkan pengalaman pengguna dan efisiensi dalam pengambilan data secara signifikan.
8. Selamat!
Anda telah menggunakan Library FHIR Engine untuk mengelola resource FHIR di aplikasi:
- Menggunakan Sync API untuk menyinkronkan resource FHIR dengan server FHIR
- Menggunakan Data Access API untuk membuat, membaca, memperbarui, dan menghapus resource FHIR lokal
- Menggunakan Search API untuk menelusuri resource FHIR lokal
Yang telah kita bahas
- Cara menyiapkan server HAPI FHIR lokal
- Cara mengupload data pengujian ke Server HAPI FHIR lokal
- Cara mem-build aplikasi Android menggunakan Library FHIR Engine
- Cara menggunakan Sync API, Data Access API, dan Search API di Library FHIR Engine
Langkah Berikutnya
- Pelajari dokumentasi untuk Library FHIR Engine
- Menjelajahi fitur lanjutan Search API
- Menerapkan Library FHIR Engine di aplikasi Android Anda sendiri