Mengenal Android Architecture Components — Room

Khairil Ushan
3 min readNov 7, 2017

--

Pada tulisan kali ini kita akan membahas salah satu dari beberapa komponen yang merupakan bagian dari Android Architecture Components(mari kita singkat saja menjadi AAC). AAC sendiri dirilis oleh Google pada perhelatan Google I/O 2017 silam. Yang mana AAC merupakan kumpulan librari yang disediakan Google untuk mengatasi 2 masalah khusus dalam Android Development, Lifecycle dan Persistency. Yang kemudian dibagi menjadi 4 komponen yaitu: Lifecycle, LiveData, ViewModel, Room.

Dan pada tulisan kali ini kita akan fokus membahas Room, yang merupakan library yang memberikan kita kemudahan dalam mengintegrasikan Android project kita dengan SQLite database. Yang mana seperti yang kita ketahui pada saat kita hendak mengintegrasikan SQLite ke dalam project kita, kita akan berhubungan dengan SQLiteOpenHelper dan Cursoryang mengharuskan kita menuliskan cukup banyak kode yang boilerplate. Sedangkan Room menyediakan interface yang sangat sederhana untuk developer mengintegrasikan SQLite ke dalam projectnya. Ditambah lagi beberapa fitur tambahan seperti kompatibilitas Room dengan RxJava sehingga kita bisa meng-eksekusi query secara asinkron.
Sederhananya bisa kita katakan, jika kita memiliki Retrofit untuk operasi networking, maka Room ada untuk operasi database.

Pada contoh-contoh kode dibawah, saya akan menggunakan Kotlin. Jadi mungkin akan ada setup dan juga kode jika kalian menggunakan Java.

Sekarang, yang perlu kita lakukan untuk mengintegrasikan Room ke dalam project kita adalah sebagai berikut:

1. Menambahkan dependency/ Update file build.gradle

Pada contoh diatas saya cuman mencantumkan perubahan yang berkaitan dengan integrasi Room.

2. Mengubah class POJO/POKO menjadi @Entity

@Entity ini pada dasarnya adalah Table dalam database kita. Yang perlu kita lakukan adalah mengubah class-class POJO (Plain Old Java Object) a.k.a Model kita untuk menjadi @Entity. Misal kita memiliki class UserModel sebagai berikut

Untuk menjadi Entity yang perlu kita lakukan adalah dengan mengubahnya seperti dibawah ini

@Entity(tableName = “users”) : Pada baris ini kita menentukan nama table untuk entity ini.

@PrimaryKey @ColumnInfo(name = “id”) val id: Int Pada baris ini kita menentukan bahwa field id ini adalah Primary Key pada table kita dan nama column nya adalah id.

3. Membuat Data access object a.k.a @Dao
Langkah selanjutnya kita akan membuat @Dao yang merupakan sebuah interface ataupun abstract class. Berikut contohnya

Pada kode di atas kita cuman membuat interface, karena Room yang kemudian akan meng-generate kode implementasi yang akan meng-eksekusi operasi-operasi SQLite. Terdapat beberapa Annotation yang tampak pada kode di atas, dan saya rasa masing-masing Annotation itu sudah cukup menjelaskan apa yang mereka lakukan dan kapan kita membutuhkannya.
Jika kalian penasaran dengan kode implementasinya, kalian bisa mengecek langsung ke file yang di-generate Room. Nama filenya adalah [YourDaoName]_Impl.java. Jadi untuk contoh di atas, nama file yang di-generate adalah UserDao_Impl.java.

Yang perlu kita perhatikan adalah, fungsi-fungsi diatas akan dieksekusi secara sinkron. Artinya jika kita mengeksekusinya pada Main Thread, maka operasi SQLite ini akan dijalankan di Main Thread. Dan Room akan menghasilkan Exception jika operasinya dijalankan pada Main Thread. Jadi yang bisa kita lakukan adalah seperti yang saya katakan sebelumnya bahwa Room mendukung integrasi dengan RxJava, jadi misal untuk contoh fungsi berikut

Untuk membuat fungsi ini dieksekusi secara asinkron, kita cukup mengubah return type nya menjadi salah satu dari beberapa jenis Observable yang ada pada RxJava. Pada kali ini kita akan menggunakan Single

4. Membuat @Database class
Class yang akan kita buat merupakan abstract class yang meng-inherit class RoomDatabase. Melalui class Database inilah kita akan memiliki akses ke implementasi Dao yang kita buat sebelumnya. Berikut contoh class Database yang bisa kita gunakan

@Database(entities = arrayOf(UserModel::class), version = 1) : Pada baris ini kita menentukan class-class @Entity yang kita gunakan dan versi dari database kita. Versi inilah yang nanti akan berkaitan dengan proses Migration.

5. Contoh penggunaan
Selanjutnya kita akan melihat bagaimana kita menggunakan hal-hal yang sudah kita persiapkan diatas untuk menyimpan atau mengambil data dari database kita.

Karena object database ini cukup expensive, maka kita sebaiknya hanya membuat satu instance selama app kita aktif. Jadi kita bisa membuat ini menjadi Singleton. Jika kita menggunakan Dagger 2 kita bisa membuat class Module untuk mem-provide instance Database ini.

Sehingga pada class Activity, Fragment atau mungkin class lain dimana kita akan menggunakan database instance ini, kita cukup meng-@Inject-nya ke variable pada class tersebut. Misalnya seperti berikut

Mungkin seperti ini saja yang bisa saya share pada tulisan kali ini. Semoga ada waktu dan kesempatan untuk membahas komponen-komponen lain dari AAC.

Sekian.

Terima Kasih. :)

--

--