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 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:

  1. Anotasikan deklarasi class dengan @Entity untuk menunjukkan bahwa deklarasi 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. Anotasi kolom kunci utama dengan @PrimaryKey.
  3. Jika salah satu kolom dalam tabel yang dihasilkan memiliki nama yang berbeda dengan nama kolom yang terkait, anotasikan kolom dengan @ColumnInfo dan tetapkan properti name ke nama kolom yang benar.
  4. 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.
  5. 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:

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:

Blog