ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin에서 Room 사용하기
    Mobile/Kotlin 2022. 4. 26. 22:15

    안드로이드의 SQLite를 더욱 활용하기 위한 Room이라는 라이브러리이다.

     

    사용하기 위해서는 app/build.gradle에 아래 내용을 추가해야 한다.

    dependencies {
    
        def room_version = "2.4.2"
    
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"
    
        // optional - RxJava2 support for Room
        implementation "androidx.room:room-rxjava2:$room_version"
    
        // optional - RxJava3 support for Room
        implementation "androidx.room:room-rxjava3:$room_version"
    
        // optional - Guava support for Room, including Optional and ListenableFuture
        implementation "androidx.room:room-guava:$room_version"
    
        // optional - Test helpers
        testImplementation "androidx.room:room-testing:$room_version"
    
        // optional - Paging 3 Integration
        implementation "androidx.room:room-paging:2.4.0-rc01"
    
    }

     

    gradle의 sync를 맞추면 Room을 사용할 수 있게 된다.

     

    Room을 사용할 구조는 아래와 같다

    Entity에는 칼럼을 정의한다.

    @Entity(primaryKeys = ["userId"])
    data class LoginEntity(
     	var userId : String,
        var password : String
    )

    위에서는 @Entity를 이용하여 객체를 선언해주고 해당 객체에 primaryKey를 userId로 선택한 것이다.

     

    칼럼들은 Entity내부에 선언한다.

     

    dao에는 이름과 같은 dao를 선언한다.

    @Dao
    interface LoginDao {
    
        @Query("SELECT userId, password FROM LoginEntity")
        fun getAutoLogin() : LoginEntity
    
        @Query("DELETE FROM LoginEntity WHERE userId = :userId")
        fun deleteAutoLogin(userId : String)
    
        @Insert
        fun insertLogin(loginEntity: LoginEntity)
    }

    dao내에는 어떤 쿼리를 만들지 선언을 한다.

     

    위에서는 userId, password를 DB에 추가하고 해당 값을 가져오고, 삭제하는 쿼리이다.

     

    getAutoLogin의 경우는 이전에 선언해 놓은 Entity의 값을 받겠다고 선언한 것이다.

     

    deleteAutoLogin은 userId의 값을 받아서 userId의 값과 같은 행을 삭제한다.

    @Database(
        entities = [LoginEntity::class],
        version = 1,
        exportSchema = false
    )
    
    abstract class LoginDatabase : RoomDatabase() {
        abstract fun loginDao() : LoginDao
    
        companion object {
            private var instance : LoginDatabase? = null
    
            @Synchronized
            fun getInstance(context: Context) : LoginDatabase? {
                if (!Optional.ofNullable(instance).isPresent){
                    synchronized(LoginDatabase::class) {
                        instance = Room.databaseBuilder(
                            context.applicationContext,
                            LoginDatabase::class.java,
                            "login-database"
                        ).build()
                    }
                }
                return instance
            }
        }
    }

    이제 테이블을 생성하는 내용을 작성해 준다.

     

    @Database에는 LoginEntity의 값을 가지고 객체를 만드는 entities와 버전을 정할 수 있는 version, 스키마를 확인할지 안 할지 선택할 수 있는 exportScheme가 있다.

     

    getInstance에는 instance가 null이면 테이블을 생성하고 아니라면 instance를 반환하는 내용이 작성되어있다.

     

    이제 main에서 호출을 할 수 있는 기반이 만들어졌다.

    private lateinit var loginDatabase: LoginDatabase 
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        loginDatabase = LoginDatabase.getInstance(applicationContext)!!
    }

    위 코드를 이용하여 앱이 실행되었을 때 db에 테이블을 생성해 준다.

     

    loginDatabase.loginDao().insertLogin("userId", "password"))

    위처럼 dao에서 선언한 쿼리들을 호출할 수 있다.

    'Mobile > Kotlin' 카테고리의 다른 글

    when 사용하기(switch)  (0) 2022.04.17

    댓글

Designed by Tistory.