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 aplikasi Anda memiliki implementasi SQLite non-Room, baca halaman ini untuk mempelajari cara bermigrasi ke Room. Jika Room adalah implementasi SQLite pertama di aplikasi Anda, lihat Menyimpan data di database lokal menggunakan Room untuk penggunaan dasar.
Langkah-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. Untuk mengetahui informasi selengkapnya tentang strategi migrasi inkremental, lihat Migrasi inkremental.
Memperbarui dependensi
Agar dapat menggunakan Room di aplikasi, Anda harus menyertakan dependensi yang sesuai
di file build.gradle aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang dependensi Room, lihat
Penyiapan.
Memperbarui class model ke entity data
Room menggunakan entity data untuk menampilkan tabel dalam database. Setiap class entity mewakili tabel dan memiliki properti yang mewakili kolom dalam tabel tersebut. Ikuti langkah-langkah berikut untuk memperbarui class model yang ada menjadi entity Room:
- Anotasikan deklarasi class dengan
@Entityuntuk menunjukkan bahwa class tersebut merupakan entity Room. Secara opsional, Anda dapat menggunakan propertitableNameuntuk menunjukkan bahwa tabel yang dihasilkan harus memiliki nama yang berbeda dengan nama class. - Anotasikan properti kunci utama dengan
@PrimaryKey. - Jika salah satu kolom dalam tabel yang dihasilkan memiliki nama yang berbeda
dengan nama properti yang terkait, anotasikan properti
dengan
@ColumnInfodan tetapkan propertinameke nama kolom yang benar. - Jika class memiliki properti yang tidak ingin dipertahankan dalam database,
anotasikan properti tersebut dengan
@Ignoreuntuk menunjukkan bahwa Room tidak boleh membuat kolom untuk properti tersebut di tabel yang sesuai. - Jika class memiliki lebih dari satu konstruktor, tunjukkan konstruktor yang harus digunakan Room dengan menganotasi semua konstruktor lainnya menggunakan
@Ignore.
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val id: String, @ColumnInfo(name = "username") val userName: String?, @ColumnInfo(name = "last_update") val date: Date?, )
Membuat DAO
Room menggunakan objek akses data (DAO) untuk menentukan fungsi yang mengakses database. Ikuti panduan dalam Mengakses data menggunakan DAO Room untuk mengganti fungsi 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 Anda tentukan.
@Database(entities = [User::class], version = 2) @ColumnTypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Menentukan jalur migrasi
Karena nomor versi database berubah, Anda harus menentukan objek
Migration untuk mempertahankan data database yang ada. Jika skema database tidak berubah, migrasi ini bisa kosong.
val MIGRATION_1_2 = object : Migration(1, 2) { override suspend fun migrate(connection: SQLiteConnection) { // Empty implementation, because the schema isn't changing. } }
Untuk mengetahui informasi selengkapnya tentang jalur migrasi database di Room, lihat 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:
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "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 Anda.
- Ikuti panduan dalam Menguji database Anda untuk menguji fungsi DAO Anda.
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 fungsi kueri ke DAO nanti.
Untuk menerapkan migrasi inkremental, dapatkan wrapper kompatibilitas SupportSQLiteDatabase
menggunakan fungsi ekstensi roomDatabase.getSupportWrapper
dari artefak androidx.room3:room3-sqlite-wrapper. Wrapper ini memungkinkan Anda menjalankan kueri SQL gaya Android langsung di database yang dikelola Room menggunakan Android SQLite API:
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")