Library persistensi Room memberikan sejumlah manfaat dibandingkan menggunakan SQLite API secara langsung:
- Verifikasi waktu kompilasi kueri SQL
- Anotasi praktis yang meminimalkan kode boilerplate muncul berulang kali dan rentan error
- Jalur migrasi database sederhana
Jika saat ini aplikasi Anda menggunakan implementasi SQLite non-Room, baca halaman ini untuk mempelajari cara memigrasikan aplikasi agar menggunakan Room. Jika Room merupakan implementasi SQLite pertama yang Anda gunakan di aplikasi, lihat Menyimpan data di database lokal menggunakan Room sebagai informasi penggunaan dasar.
Langkah migrasi
Lakukan langkah-langkah berikut untuk memigrasikan implementasi SQLite ke Room. Jika implementasi SQLite menggunakan database besar atau kueri yang kompleks, Anda mungkin sebaiknya bermigrasi ke Room secara bertahap. Lihat Migrasi inkremental untuk strategi migrasi inkremental.
Memperbarui dependensi
Agar dapat menggunakan Room di aplikasi, Anda harus menyertakan dependensi yang sesuai
di file build.gradle
aplikasi Anda. Lihat Penyiapan untuk
dependensi Room terbaru.
Memperbarui class model ke entity data
Room menggunakan entity data untuk menampilkan tabel dalam database. Setiap class entity menampilkan tabel dan memiliki kolom yang mewakili kolom dalam tabel tersebut. Ikuti langkah-langkah berikut untuk memperbarui class model yang ada menjadi entity Room:
- Anotasikan deklarasi class dengan
@Entity
untuk menunjukkan bahwa deklarasi tersebut merupakan entity Room. Secara opsional, Anda dapat menggunakan propertitableName
untuk menunjukkan bahwa tabel yang dihasilkan harus memiliki nama yang berbeda dengan nama class. - Anotasi kolom kunci utama dengan
@PrimaryKey
. - Jika salah satu kolom dalam tabel yang dihasilkan memiliki nama yang berbeda
dengan nama kolom yang terkait, anotasikan kolom dengan
@ColumnInfo
dan tetapkan propertiname
ke nama kolom yang benar. - Jika class memiliki kolom yang tidak ingin dipertahankan dalam database,
anotasikan kolom tersebut dengan
@Ignore
untuk menunjukkan bahwa Room tidak boleh membuat kolom untuk kolom tersebut di tabel yang sesuai. - Jika class memiliki lebih dari satu metode konstruktor, tunjukkan konstruktor
yang harus digunakan oleh Room dengan menganotasi semua konstruktor lainnya menggunakan
@Ignore
.
Kotlin
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val mId: String, @ColumnInfo(name = "username") val mUserName: String?, @ColumnInfo(name = "last_update") val mDate: Date?, )
Java
@Entity(tableName = "users") public class User { @PrimaryKey @ColumnInfo(name = "userid") private String mId; @ColumnInfo(name = "username") private String mUserName; @ColumnInfo(name = "last_update") private Date mDate; @Ignore public User(String userName) { mId = UUID.randomUUID().toString(); mUserName = userName; mDate = new Date(System.currentTimeMillis()); } public User(String id, String userName, Date date) { this.mId = id; this.mUserName = userName; this.mDate = date; } }
Membuat DAO
Room menggunakan objek akses data (DAO) untuk menentukan metode yang mengakses database. Ikuti panduan dalam Mengakses data menggunakan DAO Room untuk mengganti metode kueri yang ada dengan DAO.
Membuat class database
Implementasi Room menggunakan class database untuk mengelola instance
database. Class database Anda harus memperluas
RoomDatabase
dan mereferensikan semua
entity dan DAO yang telah ditentukan.
Kotlin
@Database(entities = [User::class], version = 2) @TypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Java
@Database(entities = {User.class}, version = 2) @TypeConverters(DateConverter.class) public abstract class UsersDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Menentukan jalur migrasi
Dengan berubahnya nomor versi database, Anda harus menentukan
objek Migration
untuk menunjukkan jalur migrasi agar Room menyimpan data yang ada di database.
Selama skema database tidak berubah,
implementasi ini bisa saja kosong.
Kotlin
val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { // Empty implementation, because the schema isn't changing. } }
Java
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // Empty implementation, because the schema isn't changing. } };
Untuk mempelajari jalur migrasi database di Room lebih lanjut, baca Memigrasikan database Anda.
Memperbarui pembuatan instance database
Setelah menentukan class database dan jalur migrasi, Anda dapat menggunakan
Room.databaseBuilder
untuk membuat instance database dengan jalur migrasi yang diterapkan:
Kotlin
val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ) .addMigrations(MIGRATION_1_2).build()
Java
db = Room.databaseBuilder( context.getApplicationContext(), UsersDatabase.class, "database-name" ) .addMigrations(MIGRATION_1_2).build();
Menguji implementasi Anda
Pastikan Anda menguji implementasi Room baru:
- Ikuti panduan di Menguji migrasi untuk menguji migrasi database.
- Ikuti panduan dalam Menguji database untuk menguji metode DAO.
Migrasi inkremental
Jika aplikasi Anda menggunakan database yang besar dan kompleks, Anda mungkin tidak akan bisa memigrasikan
aplikasi ke Room sekaligus. Sebagai gantinya, Anda dapat mengimplementasikan entity data
dan database Room sebagai langkah pertama, lalu memigrasikan metode
kueri ke DAO nanti. Anda dapat melakukannya dengan mengganti class helper
database kustom dengan objek SupportSQLiteOpenHelper
yang telah diterima dari
RoomDatabase.getOpenHelper()
.
Referensi lainnya
Untuk mempelajari cara bermigrasi dari SQLite ke Room lebih lanjut, lihat referensi tambahan berikut: