오늘도 더 나은 코드를 작성하였습니까?

Room은 특정 프레임워크나 API와의 상호 운용성 본문

Android Jetpack Architecture/Room

Room은 특정 프레임워크나 API와의 상호 운용성

hik14 2020. 8. 25. 20:41

특수한 반환 유형을 비롯하여 쿼리 메서드에 다양한 반환 유형을 지원합니다. 다음 표는 쿼리 유형 및 프레임워크에 기반한 관련 반환 유형을 보여줍니다.

 

Flow을 사용하는 반응형 쿼리

Room 2.2 이상에서는 Kotlin의 Flow 기능을 사용하여 앱의 UI를 최신 상태로 유지할 수 있습니다.

기본 데이터가 변경될 때 UI가 자동으로 업데이트되도록 하려면 Flow 객체를 반환하는 쿼리 메서드를 작성하세요.

 

테이블의 데이터가 변경될 때마다 반환된 Flow 객체가 쿼리를 다시 트리거하고 전체 결과 세트를 다시 내보냅니다.

 

테이블 데이터 변경 ----> 이전에 반환된 Flow 객체가 DB에 쿼리 요청하여 변경된 데이터 수신한다.

 

Flow를 사용하는 반응형 쿼리에는 한 가지 중요한 제한사항이 있습니다.

Flow 객체는 행이 결과 세트에 있든 없든(기존에 반환된 값에 존재 하지 않더라도) 테이블의 행이 업데이트될 때마다 쿼리를 다시 실행합니다.

 

distinctUntilChanged() 연산자를 반환된 Flow 객체에 적용하여 실제 쿼리 결과가 변경될 때만 UI에 알림을 보낼 수 있습니다.

    @Dao
    abstract class UsersDao {
        @Query("SELECT * FROM User WHERE username = :username")
        abstract fun getUser(username: String): Flow<User>

        fun getUserDistinctUntilChanged(username:String) =
               getUser(username).distinctUntilChanged()
    }

Kotlin 코루틴으로 비동기 쿼리

Kotlin 코루틴 기능을 사용해 suspend Kotlin 키워드를 DAO 메서드에 추가하여 메서드를 비동기식으로 설정할 수 있습니다. 이렇게 하면 메인 스레드에서 이러한 메서드를 실행할 수 없습니다.

 

    @Dao
    interface MyDao {
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertUsers(vararg users: User)

        @Update
        suspend fun updateUsers(vararg users: User)

        @Delete
        suspend fun deleteUsers(vararg users: User)

        @Query("SELECT * FROM user")
        suspend fun loadAllUsers(): Array<User>
    }
    

 Kotlin 코루틴과 함께 Room을 사용하려면 Room 2.1.0, Kotlin 1.3.0 및 Coroutines 1.0.0 이상이 필요하다.

 

@Transaction 주석이 달린 DAO 메서드에도 적용됩니다.

이 기능을 사용하여 다른 DAO 메서드에서 보류 중인 데이터베이스 메서드를 빌드할 수 있습니다.

이러한 메서드는 단일 데이터베이스 트랜잭션에서 실행됩니다

 

Room은 트랜잭션을 독점적으로 처리하고 한 번에 하나씩만 순서대로 실행하므로 단일 데이터베이스 트랜잭션 내에서 앱 측 작업을 추가로 실행하지 마세요

즉, 필요한 것보다 많은 작업이 포함된 트랜잭션은 데이터베이스를 쉽게 잠그고 성능에 영향을 줄 수 있습니다.

 

LiveData로 식별 가능한 쿼리

쿼리를 실행할 때 대개 데이터 변경 시 앱 UI가 자동으로 업데이트되기를 원할 것입니다.

이러한 작업을 실행하려면 쿼리 메서드 설명에서 LiveData 유형의 반환 값을 사용하세요.

데이터베이스가 업데이트될 때 Room에서 LiveData를 업데이트하는 데 필요한 모든 코드를 생성합니다.

 

    @Dao
    interface MyDao {
        @Query("SELECT first_name, last_name FROM user WHERE region IN (:regions)")
        fun loadUsersFromRegionsSync(regions: List<String>): LiveData<List<User>>
    }
    

버전 1.0부터 Room은 쿼리에서 액세스 한 테이블 목록을 사용하여 LiveData 인스턴스를 업데이트할지 판단합니다.

'Android Jetpack Architecture > Room' 카테고리의 다른 글

DAO를 사용하여 데이터 액세스  (0) 2020.08.25
뷰 만들기  (0) 2020.08.24
중첩된 관계 정의  (0) 2020.08.23
객체 간 관계 정의  (0) 2020.08.23
테이블 검색 지원  (0) 2020.08.23