Room을 사용하여 로컬 데이터베이스에 데이터 저장
앱에서 Room을 사용하려면 앱의 build.gradle 파일에 다음 종속 항목을 추가한다.
plugins {
id 'kotlin-kapt'
}
dependencies {
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
Room 세가지 주요 구성요소
- 데이터베이스 : 앱의 지속적인 관계형 데이터의 기본 연결을 위한 기본 엑세스 포인트 역할을 한다.
@Database 로 주석이 지정된 클래스는 다음의 조건을 충족해야 한다.
- RoomDatebase 를 확정하는 추상클래스여야 한다.
- 주석 내에 데이터베이스와 연결된 항목의 목록을 포함해야 한다.
- 인수가 0개이며 @Dao 로 주석이 지정된 클래스를 반환하는 추상 메서드를 포함해야 한다.
- 항목 (data class) : 데이터베이스 내의 테이블을 나타낸다.
- Dao : 데이터베이스에 액세스하는 데 사용되는 메서드가 포함되어 있다.
앱은 Room 데이터베이스를 사용하여 데이터베이스와 연결된 데이터 액세스 개체 또는 DAO를 가져온다. 그런 다음 앱은 각 DAO를 사용하여 데이터베이스에서 항목(data class)을 가져오고 항목의 변경사항을 다시 데이터베이스에 저장한다. 마지막으로 앱의 항목을 사용하여 데이터베이스 내의 테이블 열(column)에 해당하는 값을 가져오고 설정한다.
User (항목 : data class)
@Entity
data class User( // 기본적으로 Room의 클래스 이름은 데이터베이스 테이블 이름으로 사용한다.
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?
@ColumnInfo(name = "last_name") val lastName: String?
Room 지속성 라이브러리를 사용할 때 관련 필드 세트를 항목(데이터베이스 내의 테이블)으로 정의한다.
각 항목의 경우 연결된 Database 객체 내에 테이블을 만들어 항목으로 보유한다.
Database 클래스의 entites 배열을 통해 항목 클래스를 참조해야 한다.
각 항목은 하나 이상의 필드를 기본 키로 정의해야 한다. 필드가 하나만 있는 경우에도 @Primarykey 주석을 사용하여 필드에 주석을 달아야 한다.
※ 항목에 자동 ID를 할당하게 하려면 @PrimaryKey의 autoGenerate 속성을 설정하면 된다.
테이블의 이름을 다르게 지정하려면 @Entity 주석의 tableName 속성을 설정하면 된다.
tableName 속성과 마찬가지로 Room은 필드 이름을 데이터베이스의 열 이름으로 사용한다.열 이름을 다르게 지정하려면 @ColumnInfo 주석을 필드에 추가한다.
@Entity(tableName = "users")
data class User (
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?
@ColumnInfo(name = "last_name") val lastName: String?
)
User Dao
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): 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(user: User)
@Delete
fun delete(user: User)
AppDatabase
@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()