안드로이드 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>
관련 글
참고자료
'안드로이드 > 코틀린' 카테고리의 다른 글
안드로이드 캡처 효과 예제 : CaptureEffectView (0) | 2024.05.02 |
---|---|
코틀린 화면 캡처 Canvas, PixelCopy 비교 (0) | 2024.04.30 |
Android 14 MediaProjection 권한 허용 : ADB Shell (0) | 2024.04.29 |
안드로이드 이미지 확대 축소 : PhotoView 예제 (0) | 2024.04.25 |
안드로이드 Room in jetpack 이해와 사용방법 (0) | 2023.02.17 |
댓글