Room에는 다음 3가지 주요 구성요소가 있다.
데이터베이스 클래스
는 데이터베이스와 연결된 DAO
인스턴스를 앱에 제공한다. 그러면 앱은 DAO
를 사용해 데이터베이스의 데이터를 연결된 데이터 항목
객체의 인스턴스로 검색할 수 있게 된다.
앱은 정의된 데이터 항목
을 사용해 상응하는 테이블의 행을 업데이트하거나 삽입할 새 행을 만들 수도 있다.
Room을 사용하려면 앱의 build.gradle
파일에 다음 종속 항목을 추가해야 한다.
dependencies {
val roomVersion = "2.4.2"
implementation("androidx.room:room-runtime:$roomVersion")
annotationProcessor("androidx.room:room-compiler:$roomVersion")
// To use Kotlin annotation processing tool (kapt)
kapt("androidx.room:room-compiler:$roomVersion")
// To use Kotlin Symbolic Processing (KSP)
ksp("androidx.room:room-compiler:$roomVersion")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$roomVersion")
// optional - RxJava2 support for Room
implementation("androidx.room:room-rxjava2:$roomVersion")
// optional - RxJava3 support for Room
implementation("androidx.room:room-rxjava3:$roomVersion")
// optional - Guava support for Room, including Optional and ListenableFuture
implementation("androidx.room:room-guava:$roomVersion")
// optional - Test helpers
testImplementation("androidx.room:room-testing:$roomVersion")
// optional - Paging 3 Integration
implementation("androidx.room:room-paging:2.5.0-alpha01")
}
User 데이터 항목을 정의한다. 각 User 인스턴스는 앱 데이터베이스의 user 테이블에 있는 행 하나를 의미한다. 공식문서 참고
다음 코드는 ID, 이름, 성 열이 포함된 User 테이블을 정의하는 간단한 예시이다.
@Entity
data class User(
@PrimaryKey val uid: Int,
val firstName: String?,
val lastName: String?
)
기본적으로 Room은 클래스 이름을 데이터베이스 테이블 이름으로 사용한다. 만약 테이블 이름을 다르게 하려면 @Entity
주석의 tableName
속성을 설정하면 된다. 마찬가지로 열 이름을 다르게 하려면 @ColumnInfo
주석을 필드에 추가하고 name
속성을 설정하면 된다.
@Entity(tableName = "users")
data class User (
@PrimaryKey val id: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
앱 데이터를 저장할 때 UserDao
라는 DAO(데이터 액세스 객체)를 정의해 UserDao
는 앱의 나머지 부분이 user
테이블의 데이터와 상호작용하는 데 사용하는 메서드를 제공한다. 공식문서 참고
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@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)
}
데이터베이스를 보유할 AppDatabase
클래스를 정의한다. AppDatabase
는 데이터베이스 구성을 정의하고 영구 데이터에 대한 앱의 기본 엑세스 포인트 역할을 한다.
데이터베이스 클래스는 다음 조건을 충족해야 한다.
entities
배열이 포함된 @Database
주석이 달려야 한다.RoomDatabase
를 확정하는 추상 클래스여야 한다.@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
데이터 항목과 DAO, 데이터베이스 객체를 정의한 후 다음 코드를 사용해 데이터베이스 인스턴스를 만든다.
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
그런 다음 AppDatabase
의 추상 메서드를 사용해 DAO 인스턴스를 가져올 수 있다. 결과적으로 DAO 인스턴스의 메스드를 사용해 데이터베이스와 상호작용할 수 있다.
val userDao = db.userDao()
val users: List<User> = userDao.getAll()