본문 바로가기
안드로이드/코틀린

안드로이드 Room 쿼리(Query) 정리

by 시작이반의반 2023. 2. 21.

안드로이드 Room 쿼리
안드로이드 Room in jetpack

 

안드로이드 Room을 사용할 때 데이터베이스와 상호작용하기 위해서 데이터 액세스 객체(DAO)를 구현합니다.

DAO 안에는 상호작용을 정의하는 메서드를 가집니다.

해당 메서드에 대해서 간단하게 살펴보면서

특히 SQL 코드가 포함된 안드로이드 Room 쿼리 메서드에 대해서 정리해보려고 합니다.

 

 

 

 

 

안드로이드 Room DAO 메서드

 

데이터베이스와 상호작용을 정의하는 DAO 메서드는 두 가지 유형을 가집니다.

  • 편의 메서드 : SQL 코드 작성 없이 상호작용을 정의합니다. (@Insert, @Update, @Delete)
  • 쿼리 메서드 : SQL 코드를 작성하여 상호작용을 정의합니다. (@Query)

 

 

 

 

 

안드로이드 Room DAO : 편의 메서드

 

편의 메서드는 아래와 같이 SQL 코드 작성 없이도 쉽게 정의가 가능합니다.

(좀 더 복잡한 삽입, 업데이트, 삭제를 정의해야 하는 경우 쿼리 메서드를 사용하는 경우도 있다고 합니다.)

@Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(vararg users: User)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(users: List<User>)

    @Update
    fun update(vararg users: User)

    @Delete
    fun delete(vararg users: User)
}

 

※ 참고 : Insert(삽입)할 때 충돌이 발생할 경우에 대한 옵션값

OnConflictStrategy.IGNORE 무시
OnConflictStrategy.REPLACE 덮어쓰기
OnConflictStrategy.FAIL 실패처리
OnConflictStrategy.ABORT 중단

 

 

 

 

안드로이드 Room DAO : 쿼리 메서드

 

쿼리 메서드의 경우 SQL을 작성을 해야 하는데 대표적으로 자주 사용되는 것들에 대해서 하나씩 살펴보려고 합니다.

아래와 같이 미리 정의해둔 Entitiy를 기준으로 정리하였습니다.

@Entity(tableName = "user")
data class User(
    @ColumnInfo(name = "first_name") val firstName: String,
    @ColumnInfo(name = "last_name") val lastName: String,
    @ColumnInfo(name = "number") val number: Int
) {
    @PrimaryKey(autoGenerate = true)
    var id = 0L
}

 

SELECT [ 필드 ]

결과에 표시할 필드값(ColumnInfo)을 선택한다.

별표시(*)를 쓰면 모든 필드값이다.

 

FROM [ 테이블 ]

어떤 테이블에서 가져올건지 결정한다.

 

DELETE FROM [ 테이블 ]

어떤 테이블을 삭제할건지 결정한다.

// 테이블(user)에서 모든 데이터를 조회한다.
@Query("SELECT * FROM user")
fun findAll(): List<User>

// 테이블(user)에서 필드값(first_name)을 조회한다.
@Query("SELECT first_name FROM user")
fun findAllFirstName(): List<String>

// 테이블(user)에서 모든 데이터를 삭제한다.
@Query("DELETE FROM user")
fun deleteAll()

 

WHERE [ 조건 ]

조건문의 시작으로 기본적인 연산(=,!=, <, >, <=, >=) 외에도 BETWEEN, LIKE, LIMIT과 함께 사용한다.

 

BETWEEN [ 최소값 ] AND [ 최댓값 ]

최대, 최소값의 사이값을 가져오는 조건문으로 사용한다.

 

LIKE [ 문자열 ]

해당 문자열이 포함되어 있는지를 확인하는 조건문으로 사용한다.

 

LIMIT [ 개수 ]

조회 결과 갯수를 정하는 조건문으로 사용한다.

// 테이블(user)에서 필드값(number)이 n인 경우의 결과를 조회한다.
@Query("SELECT * FROM user WHERE number = :n")
fun findByNumber(n: Int): List<User>

// 테이블(user)에서 필드값(number)이 min/max 사이인 결과를 조회한다.
@Query("SELECT * FROM user WHERE number BETWEEN :min AND :max")
fun findByNumberBetween(min: Int, max: Int): List<User>

// 테이블(user)에서 필드값(first_name)이 keyword를 포함한 결과를 조회한다.
@Query("SELECT * FROM user WHERE first_name LIKE :keyword")
fun findByKeyword(keyword: String): User

// 테이블(user)에서 필드값(number)이 n보다 큰 결과 5개를 조회한다.
@Query("SELECT * FROM user WHERE number > :n LIMIT 5")
fun findByNumberMoreThan(n: Int): List<User>

 

ORDER BY [ 필드 ] ASC / DESC

특정 필드값을 기준으로 오름차순(ASC) / 내림차순(DESC)으로 정렬된 결과를 조회할 수 있다.

// 테이블(user)에서 필드값(number) 기준 오름차순으로 모든 데이터를 조회한다.
@Query("SELECT * FROM user ORDER BY number ASC")
fun findAllAsc(): List<User>

// 테이블(user)에서 필드값(number) 기준 내림차순으로 모든 데이터를 조회한다.
@Query("SELECT * FROM user ORDER BY number DESC")
fun findAllDesc(): List<User>

 

 

 

관련 글

 

안드로이드 Room 쿼리(Query) 정리

 

안드로이드 Room 쿼리(Query) 정리

안드로이드 Room을 사용할 때 데이터베이스와 상호작용하기 위해서 데이터 액세스 객체(DAO)를 구현합니다.DAO 안에는 상호작용을 정의하는 메서드를 가집니다.해당 메서드에 대해서 간단하게 살

joo-selfdev.tistory.com

참고자료

 

Room DAO를 사용하여 데이터 액세스

 

Room DAO를 사용하여 데이터 액세스  |  Android 개발자  |  Android Developers

Room 라이브러리의 일부인 DAO(데이터 액세스 개체)를 사용하여 데이터베이스 테이블을 수정하는 방법 알아보기

developer.android.com

댓글