[Android-kotlin] Room 사용법

JI HYUN KIM ·2021년 10월 10일
0

android-kotlin

목록 보기
1/1
post-thumbnail

( 주의 ) 혼자 공부하고 이해한 것을 정리해본 것 입니다. 여기저기에서 많이 참조하여 다소 두서없을 수 있습니다 !

🤔 Room 이란 ?

Room 지속성 라이브러리는 SQLite에 추상화 레이어를 제공하여 SQLite를 완벽히 활용하면서 더 견고한 데이터베이스 액세스를 가능하게 합니다.
by android developer

다음과 같이 Room을 정의하고 있다. 즉, SQLlite를 직접적으로 사용하지 않고 Room이라는 라이브러리를 통해서 SQLite를 사용하는 것이다.

🙄왜 사용할까 ?

그렇다면, 직접적으로 Room 대신에 SQLite를 사용해도 되는데,
왜 다른 라이브러리를 사용하는 것일까?

상당한 양의 구조화된 데이터를 처리하는 앱은 데이터를 로컬로 유지하여 대단한 이점을 얻을 수 있습니다. 가장 일반적인 사용 사례는 관련 데이터를 캐싱하는 것입니다. 이런 방식으로 기기가 네트워크에 액세스할 수 없을 때 오프라인 상태인 동안에도 사용자가 여전히 콘텐츠를 탐색할 수 있습니다. 나중에 기기가 다시 온라인 상태가 되면 사용자가 시작한 콘텐츠 변경사항이 서버에 동기화됩니다.
by android developer

즉, 온, 오프라인 상관없이 database를 사용하고 싶기 때문이다 !

😮 어떻게 사용하는가 ?

이제 부터 어떻게 사용하는지에 대해 깊게 파고들겠다.

  1. data entities 만들기 - database의 table을 대표한다
  2. data access object (데이터 접근 객체) 만들기 - 쿼리문 사용하는 곳
  3. database class 만들기 - database와 서비스를 잇는 main access point

1. Data entity

@Entity(tableName = "user_table")
data class User(
    @PrimaryKey(autoGenerate = true) var userid: Int?,
    @ColumnInfo(name = "devicenum") var devicenum: Int?
    )

user_table이라는 이름을 가진 entity를 만들었다.
User table에서는 @primarykey로 userid를 갖고있고 없다면
autoGenerate(자동생성)하도록 만들었다.
그 외의 열은 @ColumnInfo로 정의하였다. devicenum같은 경우
Int형을 갖고있는 열이다.

2. Data Access Object (DAO)

interface UserDao {
    @Insert 
    fun addUser(user:User)

    @Query("SELECT * FROM user_table ORDER BY userid ASC")
    fun readAllData(): LiveData<List<User>>
    
    @Delete
    fun delete(user:User)
}

user table에서 사용하고 싶은 쿼리를 inteface userdao에 사용한다.
기존 쿼리문 처럼 @Query를 통해 SELECT문을 사용할 수 있다.
또한 WHERE문을 사용하여 특정 id를 지정하여 쿼리를 생성할 수도 있는데 이때 특정 id는 :id와 같이 표시하고 함수의 메개변수로 받으면 된다

3. Database

@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase: RoomDatabase() {
    abstract fun userDao():UserDao

    companion object {
        @Volatile
        private var INSTANCE: UserDatabase? = null

        fun getDatabase(context: Context): UserDatabase{
            val tempInstance = INSTANCE
            if(tempInstance != null){
                return tempInstance
            }
            synchronized(this){
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    UserDatabase::class.java,
                    "user_database"
                ).build()
                INSTANCE = instance
                return instance
            }
        }

    }
}

데이터 베이스와 연결시켜주는 class이다.
반드시 RoomDatabase를 확장 해야한다. 그리고 databasebuilder에서

synchronized(this){
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    UserDatabase::class.java,
                    "user_database"
                ).build()
                INSTANCE = instance
                return instance

이 부분을 통해 database class와 entity를 연결시켜준다

😁참고자료

room

profile
개발자가 되어가는 중

0개의 댓글