Teori
Dalam membuat aplikasi Android kita terkadang harus menyimpan data yang dihasilkan dari aplikasi kita, baik tersimpan secara cloud ataupun local. di Android ada 2 library penyimpanan data yang dikenal yaitu SQLite dan Realm namun yang paling sering dipakai adalah SQLite. namun untuk menggunakan SQLite perlu banyak kode yang terkadang membingungkan untuk maintainingnya. karena itu Room diciptakan, Room menggunakan SQLite sebagai core nya namun dengan kode yang lebih simple dan mudah dimengerti.
“Room memberikan lapisan abstraksi pada SQLite untuk memungkinkan akses database yang lancar sekaligus memanfaatkan kemampuan SQLite secara optimal”
source : https://developer.android.com/training/data-storage/room
Room memiliki 3 komponen diantaranya adalah :
- Database
berfungsi untuk melakukan koneksi dari device ke database room. menggunakan annotasi @Database. class Database harus memenuhi beberapa syarat diantaranya :
– harus berupa Abstract Class yang meng extends ke RoomDatabase
– harus menyertakan entities yang berhubungan dengan Database dan versi dari Database
– harus berisi Abstract Method yang tidak memiliki argument dan memiliki nilai return class Dao
contoh dari Database :
- Entity
Entity adalah struktur tabel pada database room. disini kita bisa menentukan nama tabel, nama kolom, dan tipe data pada kolom. class Entity menggunakan annotation @Entity, kita tidak boleh menggunakan Object sebagai tipe data dari Entity.
contoh dari Entity :
kita menggunakan annotation @PrimaryKey untuk membuat primaryKey dari tabel kita, kita juga menggunakan annotation @ColumnInfo untuk mendefinisikan kolom, namun sebenarnya tanpa annotation @ColumnInfo variabel tetap akan dianggap sebagai kolom namun nama dari kolomnya akan mengikuti penamaan variabel. begitupun pada annotation @Entity, jika kita hanya menulis @Entity tanpa menentukan tableName nya maka penamaan dari tabel akan mengikuti nama class nya.
- Dao
Dao berisikan metode yang digunakan pada database, atau mungkin bisa dibilang Dao berisikan query-query dari database kita. Dao menggunakan annotation @Dao, Dao harus berupa class interface.
contoh dari Dao :
disitu kita menggunakan annotation @Query untuk menggunakan Raw Query, @Insert untuk insert data ke database, @Update untuk mengupdate data dari database, dan @Delete untuk menghapus data.
Praktek
oke sekarang kita coba untuk praktek agar lebih paham.
buat satu proyek dengan bahasa kotlin di Android Studio.
pasang library ViewModel, Room, dan dataBinding pada build.gradle (app). disini kita akan menggunakan Architecture Pattern MVVM
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
}
android {
...
// Untuk mengaktifkan fitur viewBinding
buildFeatures {
dataBinding true
}
}
dependencies {
...
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'com.google.android.material:material:1.3.0'
// Library View Model
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
// Library Room
implementation 'androidx.room:room-runtime:2.3.0'
implementation "androidx.room:room-ktx:2.3.0"
kapt 'androidx.room:room-compiler:2.3.0'
...
}
edit layout pada activity_main.xml
kita beri main activity recyclerview dan satu floating action button
buat juga layout untuk tiap row pada recyclerview
lalu buat satu Activity baru dengan nama AddStudentActivity.
edit layoutnya menjadi seperti berikut :
Sekarang buat Entity nya.
buat satu package baru dengan nama room, lalu didalam package tersebut buat satu class baru dengan nama StudentEntity, extends kan ke Parcelable juga agar kita bisa mengirimkan data antar activity
buat satu interface baru didalam package room dengan nama StudentDao
disitu kita menggunakan suspend function karena kita akan melakukan semua proses pada database secara asynchronous. hal ini diwajibkan untuk room, karena jika tidak menggunakan suspend function akan muncul error saat di run.
lalu setelah itu buat class Database nya.
buat satu class lagi di dalam package room dengan nama AppDatabase
buat satu class lagi di dalam package room dengan nama LocalDataSource untuk mempermudah kita untuk mengakses StudentDao
disitu kita menggunakan CoroutineScope untuk menjalankan suspend function.
Sekarang kita buat Adapter untuk Recyclerview nya.
beri nama StudentAdapter.kt
lalu buat class view model untuk MainActivity, beri nama MainViewModel. didalamnya terdapat function untuk get data dari database
sekarang edit koding pada MainActivity.
disitu terdapat onActivityResult untuk get data dari database setelah terjadi perubahan pada database.
kita juga meng observe data dari variabel students pada MainViewModel lalu memasang data tersebut ke adapter
sekarang kita buat ViewModel untuk AddStudentActivity, beri nama AddStudentViewModel
Setelah itu kita edit koding pada AddStudentActivity
Sekarang kita coba run, jika berhasil maka akan tampil halaman blank dengan floating action button
halamannya kosong karena kita belum menambahkan data, klik tombol tambah untuk menambahkan data.
isi kedua form yang ada, lalu klik simpan
jika berhasil maka akan kembali ke halaman awal dengan recyclerview yang telah terisi. jika kita klik data tersebut maka akan masuk ke AddStudentActivity, namun dengan mode edit.
coba ubah data yang ada maka data akan terupdate dan coba klik hapus maka data akan terhapus dari database.
cukup mudah bukan menggunakan room sebagai penyimpan data persistance di aplikasi Android, kita sebenarnya bisa melakukan migration jika kita ingin merubah struktur Entity atau kita juga bisa menggunakan relation untuk menghubungkan suatu Entity dengan Entity lainnya yang mungkin akan kita bahas di Artikel selanjutnya, tetap stay tune di Blog ini.
Source code dari artikel ini bisa dilihat disini
untuk mempelajari lebih lanjut tentang room bisa dilihat disini
Semoga apa yang saya sampaikan bisa bermanfaat bagi pembaca sekalian, Terima kasih telah mampir.