[Android] Room

jeunguri·2022년 6월 1일
0

android

목록 보기
7/13


기본 구성요소


Room에는 다음 3가지 주요 구성요소가 있다.

  • 데이터베이스 클래스
  • 데이터 항목 : 앱 데이터베이스의 테이블을 나타냄
  • DAO : 쿼리, 업데이트, 삽입, 삭제 메서드 제공


데이터베이스 클래스는 데이터베이스와 연결된 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")
}



Room 항목을 사용해 데이터 정의


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?
)



Room DAO를 사용해 데이터 액세스


앱 데이터를 저장할 때 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를 확정하는 추상 클래스여야 한다.
  • 데이터베이스와 연결된 각 DAO 클래스에서 데이터베이스 클래스는 인수가 0개이고, DAO 클래스의 인스턴스를 반환하는 추상 메스드를 정의해야 한다.

@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()


0개의 댓글