이번에 혼자 플젝을 하면서 Room을 도입하였습니다. 제가 참고한 프로젝트는 android에서 제공하는 sunflower 입니다. 원래는 realm을 도입하려고 했는데 다른 회사 구인 구직을 보다가 보니 room을 이용하는 곳들이 많은 듯 해서 이쪽을 우선으로 보게 되었습니다. 이전에 저는 SQLite를 사용하여 직접 데이터를 저장하는 방식으로 진행하였습니다. 쿼리를 직접 String으로 쓴 후에 데이터를 재조합 하여야 하는 등 후 작업이 많았는데요. ROOM은 그런 번거로운 과정을 줄이기 위해 다음과 같은 제공하고 있습니다
가장 기본적으로 gradle에 추가하여야 하는 부분은 다음과 같습니다
dependencies {
implementation("androidx.room:room-ktx:2.4.3")
kapt("androidx.room:room-compiler:2.4.3")
}
이외에도 optional 로 기능을 추가하여 사용할 수 있기때문에 사이트를 참고하시면
부가 기능을 더 추가하여 사용할 수 있습니다
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
@Database
주석을 단 entities 배열을 포함해야 합니다enableMultiInstanceInvalidation()
를 포함하여 공유 데이터베이스 파일을 무효화 할 수 있으며다른 프로세스내의 appDatabase인스턴스로 자동 전파되게 할 수 있습니다@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
@Entity
주석이 달린 클래스로 정의해야 합니다@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)
}
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
AppDatabase의 추상 메서드로 DAO를 가져와서 데이터 베이스와 상호 작용 할 수 있습니다.
val userDao = db.userDao()
val users: List<User> = userDao.getAll()