Implementasi Room Database
Room adalah layer basis data di atas basis data SQLite. Room mempermudah
operasi-operasi yang ditangani oleh SQLiteOpenHelper
. Hal-hal yang perlu
diperhatikan ketika mengimplementasikan basis data room sebagai berikut:
Room menggunakan DAO untuk melakukan operasi query ke database
Secara default, untuk menghindari performa yang buruk pada UI, Room tidak memperbolehkan operasi database pada main thread. Dengan menggunakan
LiveData
dapat dilakukan query secara otomatis secara asynchronous.Room melakukan pengecekan secara compile-time pada pernyataan SQLite. Jika terjadi pernyataan yang tidak valid, maka project tidak dapat dibuild.
Implementasi room harus merupakan turunan
RoomDatabase
.Secara umum, hanya dibutuhkan satu buah instance database dalam sebuah aplikasi.
Sebagai referensi untuk mengimplementasikan Room database, silahkan ikuti langkah berikut.
- Buatlah sebuah
abstract class
yang merupakan turunan dariRoomDatabase
, simpan pada packagedb
dan beri nama denganAppDatabase
.
public abstract class AppDatabase extends RoomDatabase {
}
- Tambahkan annotation
@Database
, serta atur entitas yang ada dalam database beserta version schema. Dikarenakan pada entitas membutuhkan operasi konversi khusus, deklarasikan juga@TypeConverters
dan set nilainya denganDateConverter
.
@Database(entities = {User.class, Note.class}, version = 1)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {
}
- Deklarasikan konstanta untuk nama database.
private static final String DB_NAME = "notes";
- Room database umumnya dideklarasikan dalam bentuk singleton pattern, untuk mencegah terjadinya instaniasi berulang database pada waktu yang bersamaan. Ikuti langkah berikut untuk mendeklarasikan singleton pattern.
private static volatile AppDatabase INSTANCE = null;
public static AppDatabase getInstance(final Context context) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DB_NAME)
.fallbackToDestructiveMigration()
.build();
}
}
return INSTANCE;
}
- Tambahkan sebuah method untuk men-destroy instance
public static void destroyInstance() {
INSTANCE = null;
}
- Tambahkan dua buah atribut yang digunakan untuk mengakses implementasi DAO.
- Atribut
userDao()
digunakan untuk operasi entitasUser
sertanoteDao()
digunakan untuk operasi entitasNote
. Room akan meng-generate implementasi operasi CRUD secara otomatis berdasarkan annotation yang didefinisikan.
public abstract UserDao userDao();
public abstract NoteDao noteDao();