Aplikasi yang menangani jumlah data terstruktur yang tidak sepele bisa mendapatkan keuntungan besar dengan mempertahankan data tersebut secara lokal. Kasus penggunaan yang paling umum adalah meng-cache bagian data yang relevan sehingga saat perangkat tidak dapat mengakses jaringan, pengguna masih dapat menjelajahi konten tersebut saat sedang offline
Pustaka persistensi Room menyediakan lapisan abstraksi di atas SQLite untuk memungkinkan akses database yang lancar sambil memanfaatkan kekuatan penuh SQLite. Secara khusus, Room memberikan manfaat berikut
- Verifikasi waktu kompilasi kueri SQL
- Anotasi praktis yang meminimalkan kode boilerplate yang berulang dan rawan kesalahan
- Jalur migrasi database yang disederhanakan
Karena pertimbangan ini, kami sangat menyarankan agar Anda menggunakan Room daripada menggunakan API SQLite secara langsung
Mempersiapkan
Untuk menggunakan Room di aplikasi Anda, tambahkan dependensi berikut ke file
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }2 aplikasi Anda
Asyik
dependencies {
def room_version = "2.5.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// To use Kotlin annotation processing tool [kapt]
kapt "androidx.room:room-compiler:$room_version"
// To use Kotlin Symbol Processing [KSP]
ksp "androidx.room:room-compiler:$room_version"
// optional - RxJava2 support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
// optional - Paging 3 Integration
implementation "androidx.room:room-paging:$room_version"
}
_Kotlin
dependencies {
val room_version = "2.5.0"
implementation["androidx.room:room-runtime:$room_version"]
annotationProcessor["androidx.room:room-compiler:$room_version"]
// To use Kotlin annotation processing tool [kapt]
kapt["androidx.room:room-compiler:$room_version"]
// To use Kotlin Symbol Processing [KSP]
ksp["androidx.room:room-compiler:$room_version"]
// optional - Kotlin Extensions and Coroutines support for Room
implementation["androidx.room:room-ktx:$room_version"]
// optional - RxJava2 support for Room
implementation["androidx.room:room-rxjava2:$room_version"]
// optional - RxJava3 support for Room
implementation["androidx.room:room-rxjava3:$room_version"]
// optional - Guava support for Room, including Optional and ListenableFuture
implementation["androidx.room:room-guava:$room_version"]
// optional - Test helpers
testImplementation["androidx.room:room-testing:$room_version"]
// optional - Paging 3 Integration
implementation["androidx.room:room-paging:$room_version"]
}
Komponen primer
Ada tiga komponen utama di Room
- Kelas basis data yang menyimpan basis data dan berfungsi sebagai titik akses utama untuk koneksi dasar ke data tetap aplikasi Anda
- Entitas data yang mewakili tabel di database aplikasi Anda
- Objek akses data [DAO] yang menyediakan metode yang dapat digunakan aplikasi Anda untuk membuat kueri, memperbarui, menyisipkan, dan menghapus data dalam database
Kelas database menyediakan aplikasi Anda dengan instance DAO yang terkait dengan database tersebut. Pada gilirannya, aplikasi dapat menggunakan DAO untuk mengambil data dari database sebagai instance dari objek entitas data terkait. Aplikasi juga dapat menggunakan entitas data yang ditentukan untuk memperbarui baris dari tabel yang sesuai, atau membuat baris baru untuk penyisipan. Gambar 1 mengilustrasikan hubungan antara berbagai komponen Room
Implementasi sampel
Bagian ini menyajikan contoh implementasi database Room dengan entitas data tunggal dan DAO tunggal
entitas data
Kode berikut mendefinisikan entitas data
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }3. Setiap instance
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }_3 mewakili baris dalam tabel
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }5 di database aplikasi
Kotlin
@Entity
data class User[
@PrimaryKey val uid: Int,
@ColumnInfo[name = "first_name"] val firstName: String?,
@ColumnInfo[name = "last_name"] val lastName: String?
]
_Jawa
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo[name = "first_name"]
public String firstName;
@ColumnInfo[name = "last_name"]
public String lastName;
}
Untuk mempelajari lebih lanjut tentang entitas data di Room, lihat Menentukan data menggunakan entitas Room
Objek akses data [DAO]
Kode berikut mendefinisikan DAO yang disebut
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }6.
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }6 menyediakan metode yang digunakan aplikasi lainnya untuk berinteraksi dengan data di tabel
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }5
Kotlin
@Dao
interface UserDao {
@Query["SELECT * FROM user"]
fun getAll[]: List
@Query["SELECT * FROM user WHERE uid IN [:userIds]"]
fun loadAllByIds[userIds: IntArray]: List
@Query["SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1"]
fun findByName[first: String, last: String]: User
@Insert
fun insertAll[vararg users: User]
@Delete
fun delete[user: User]
}
Jawa
@Dao
public interface UserDao {
@Query["SELECT * FROM user"]
List getAll[];
@Query["SELECT * FROM user WHERE uid IN [:userIds]"]
List loadAllByIds[int[] userIds];
@Query["SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1"]
User findByName[String first, String last];
@Insert
void insertAll[User.. users];
@Delete
void delete[User user];
}
Untuk mempelajari DAO lebih lanjut, lihat Mengakses data menggunakan DAO Room
Basis data
Kode berikut mendefinisikan kelas
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }_9 untuk menampung database.
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }_9 menentukan konfigurasi database dan berfungsi sebagai titik akses utama aplikasi ke data yang disimpan. Kelas database harus memenuhi kondisi berikut
- Kelas harus dianotasi dengan anotasi
@Entity data class User[ @PrimaryKey val uid: Int, @ColumnInfo[name = "first_name"] val firstName: String?, @ColumnInfo[name = "last_name"] val lastName: String? ]
1 yang menyertakan larik yang mencantumkan semua entitas data yang terkait dengan database - Kelas harus berupa kelas abstrak yang diperluas
@Entity data class User[ @PrimaryKey val uid: Int, @ColumnInfo[name = "first_name"] val firstName: String?, @ColumnInfo[name = "last_name"] val lastName: String? ]
3 - Untuk setiap kelas DAO yang diasosiasikan dengan database, kelas database harus mendefinisikan metode abstrak yang memiliki argumen nol dan mengembalikan turunan dari kelas DAO
Kotlin
@Database[entities = [User::class], version = 1]
abstract class AppDatabase : RoomDatabase[] {
abstract fun userDao[]: UserDao
}
Jawa
@Database[entities = {User.class}, version = 1]
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao[];
}
Catatan. Jika aplikasi Anda berjalan dalam satu proses, Anda harus mengikuti pola desain tunggal saat membuat instance objek
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }9. Setiap instans
@Entity data class User[ @PrimaryKey val uid: Int, @ColumnInfo[name = "first_name"] val firstName: String?, @ColumnInfo[name = "last_name"] val lastName: String? ]_3 cukup mahal, dan Anda jarang memerlukan akses ke banyak instans dalam satu proses
Jika aplikasi Anda berjalan dalam beberapa proses, sertakan
@Entity data class User[ @PrimaryKey val uid: Int, @ColumnInfo[name = "first_name"] val firstName: String?, @ColumnInfo[name = "last_name"] val lastName: String? ]6 dalam pemanggilan pembuat database Anda. Dengan begitu, ketika Anda memiliki instance
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }9 di setiap proses, Anda dapat membatalkan file database bersama dalam satu proses, dan pembatalan ini secara otomatis menyebar ke instance
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }9 dalam proses lain
Penggunaan
Setelah Anda menentukan entitas data, DAO, dan objek database, Anda dapat menggunakan kode berikut untuk membuat instance database
Kotlin
val db = Room.databaseBuilder[
applicationContext,
AppDatabase::class.java, "database-name"
].build[]
Jawa
AppDatabase db = Room.databaseBuilder[getApplicationContext[],
AppDatabase.class, "database-name"].build[];
Anda kemudian dapat menggunakan metode abstrak dari
dependencies { val room_version = "2.5.0" implementation["androidx.room:room-runtime:$room_version"] annotationProcessor["androidx.room:room-compiler:$room_version"] // To use Kotlin annotation processing tool [kapt] kapt["androidx.room:room-compiler:$room_version"] // To use Kotlin Symbol Processing [KSP] ksp["androidx.room:room-compiler:$room_version"] // optional - Kotlin Extensions and Coroutines support for Room implementation["androidx.room:room-ktx:$room_version"] // optional - RxJava2 support for Room implementation["androidx.room:room-rxjava2:$room_version"] // optional - RxJava3 support for Room implementation["androidx.room:room-rxjava3:$room_version"] // optional - Guava support for Room, including Optional and ListenableFuture implementation["androidx.room:room-guava:$room_version"] // optional - Test helpers testImplementation["androidx.room:room-testing:$room_version"] // optional - Paging 3 Integration implementation["androidx.room:room-paging:$room_version"] }9 untuk mendapatkan instance DAO. Pada gilirannya, Anda dapat menggunakan metode dari instance DAO untuk berinteraksi dengan database