Bermigrasi dari SQLite ke Room

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:

  1. Anotasikan deklarasi class dengan @Entity untuk menunjukkan bahwa class tersebut merupakan entity Room. Secara opsional, Anda dapat menggunakan properti tableName untuk menunjukkan bahwa tabel yang dihasilkan harus memiliki nama yang berbeda dengan nama class.
  2. Anotasikan properti kunci utama dengan @PrimaryKey.
  3. Jika salah satu kolom dalam tabel yang dihasilkan memiliki nama yang berbeda dengan nama properti yang terkait, anotasikan properti dengan @ColumnInfo dan tetapkan properti name ke nama kolom yang benar.
  4. Jika class memiliki properti yang tidak ingin dipertahankan dalam database, anotasikan properti tersebut dengan @Ignore untuk menunjukkan bahwa Room tidak boleh membuat kolom untuk properti tersebut di tabel yang sesuai.
  5. 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:

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 ...")