Room 라이브러리는 SQLite 위에 추상화 계층을 제공하여 SQLite의 모든 기능을 활용하면서도 데이터베이스 액세스를 원활하게 할 수 있음. (로컬 데이터베이스)
1. SQL 쿼리의 컴파일 시 확인
2. 반복적이고 오류가 발생하기 쉬운 보일러플레이트 코드를 최소화하는 편리한 주석
3. 간소화된 데이터베이스 마이그레이션 경로
데이터 베이스 클래스
데이터베이스를 보유하고 앱의 영구 데이터에 대한 기본 연결 지점 역할을 하는 클래스.
데이터 엔티티
앱의 데이터베이스 내 테이블을 나타내는 엔티티.
데이터 액세스 객체(DAO)
앱이 데이터베이스에서 데이터를 쿼리, 업데이트, 삽입 및 삭제할 수 있는 메서드를 제공하는 객체.
데이터베이스 클래스가 해당 데이터베이스와 관련된 DAO 인스턴스를 앱에 제공함.
= 앱이 DAO를 사용하여 데이터베이스에서 관련 데이터 엔티티 객체의 인스턴스로 데이터를 검색할 수 있음.
앱이 정의된 데이터 엔티티를 사용하여 해당 테이블의 행을 업데이트하거나 삽입할 수 있음.
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
@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)
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
그리고 AppDatabase의 추상메서드를 사용하여 DAO의 인스턴스를 가져올 수 있음.
val userDao = db.userDao()
val users: List<User> = userDao.getAll()