프로젝트를 하다보면 서버를 거칠 필요없이 앱 내부에서만 사용하는 데이터를
관리하고 싶을때가 있다.
- txt 파일로 앱에 저장하거나
- SharedPreferences 를 사용하거나
- DataStore 를 사용하거나
여러 방법이 있겠지만 간단하게 저장만을 위한 것이 아닌 많은 데이터들을
좀 더 사용하기 편한 방식으로, 또는 데이터간의 관계를 가지기 위해서는 Room 을 사용해야한다.
Sql 에 대한 지식이 있는 사람이라면 간단한 쿼리를 적는건 어렵지 않을 수 있겠지만
나의 경우엔 정말 간단한 쿼리만 적어서 사용했고 1:N 관계나 외래키 등록같은건 Room 에서 다룰일이 없었는데
이번에 사용할 기회가 생겨서 적어보려 한다.
Entity(table) 간의 관계 정의하기
room의 관계형 쿼리는 현재 2가지 방식을 통해 작성 할 수 있다.
- Intermediate data class : 포함된 객체가 있는 중간 데이터 클래스를 사용하여 관계를 모델링
- Multimap return types (권장) : multimap 리턴 타입의 관계형 쿼리 (Join 등을 사용하여)
두가지 경우로 작성을 모두 해봤는데 Multimap return types 을 구글에서는 권장하고 있다.
Intermediate data class
바로 코드부터 봐보자
@Entity
data class LinkData(
@PrimaryKey
val uid : Long = 0,
val link : String,
val linkGroupId : String,
val linkTitle : String,
val linkMemo : String,
val createDate : String,
val updateDate : String,
val favorite: Boolean
)
@Entity(tableName = "group")
data class GroupData(
@PrimaryKey
val groupId : Long = 0,
val groupName : String,
val groupIconId : Long,
val createDate : String,
val updateDate : String
)
data class LinkWithGroupData(
@Embedded val groupData: GroupData,
@Relation(
parentColumn = "groupId",
entityColumn = "linkGroupId"
)
val linkList: List<LinkData>
)
Group 이 link 데이터를 담는 폴더라고 생각하면 편하다.
하나의 group 은 여러 link 의 데이터를 가질 수 있는데 세번째 data class 가 핵심이다.
parentColumn 은 1:N 의 관계에서 1인 부모를 식별할 데이터 컬럼을 적는다.
entityColumn 은 1: N 의 관계에서 N인 자식을 식별할 데이터 컬럼을 적는다.
그리고 linkList 로 적혀있는 list 가 결과물로 나오는 방식이다.
이 방식의 경우에는 data class 를 하나 더 만들어줘야하는 귀찮음이 있다.
Dao 에서 쿼리를 적어줄때는 아래와 같이 하면 된다.
@Transaction
@Query("SELECT * FROM `group` ORDER BY groupId DESC")
fun getGroupAndLinkData() : List<LinkWithGroupData>
Multimap return types
여기선 sql 의 join 개념을 이용한다.
@Query(
"SELECT * FROM `group` JOIN LinkData ON `group`.groupId = LinkData.linkGroupId"
)
fun loadGroupAndLink(): Map<GroupData, List<LinkData>>
쉽다.
반응형
'Android' 카테고리의 다른 글
[다시 만들어보는 클린아키텍쳐] 모듈분리 편 (1) | 2024.07.25 |
---|---|
hilt에서 같은 타입의 객체에 대한 디펜던시를 주입할때 (0) | 2024.07.09 |
안드로이드 키보드 높이 구하기 (2) | 2024.04.29 |
안드로이드에서 FFMPEG로 m3u8 to mp4 하기 (1) | 2023.12.02 |
라이브러리 배포 후 적용을 하려는데 NoClassDefFoundError ? (0) | 2023.11.16 |
eventFlow 방식으로 이벤트를 처리하고 있을 때 든 생각 (1) | 2023.07.05 |
MockK 를 사용해서 테스트 코드를 적어보자 (2) | 2023.05.14 |
android 12 블루투스 대응 (0) | 2023.04.06 |