Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 반응형 프로그래밍
- 일상
- Flutter
- 코틀린
- 안드로이드
- 코딩테스트
- Java
- Dev6
- android compose
- Go언어
- 안드로이드 다이얼로그
- 이펙티브코틀린
- Kotiln
- Firebase
- 이펙티브 코틀린
- android
- 개발자
- Swift 문법
- 코루틴
- MVVM
- swift map
- Rxjava 안드로이드
- 안드로이드 개발자
- 알고리즘
- RxJava
- 안드로이드 컴포즈
- react
- 프로그래머스
- 잡담
- RxKotiln
Archives
- Today
- Total
최데브는 오늘도 프로그래밍을 한다.
Android Room Entity Relation 본문
반응형
프로젝트를 하다보면 서버를 거칠 필요없이 앱 내부에서만 사용하는 데이터를
관리하고 싶을때가 있다.
- 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' 카테고리의 다른 글
안드로이드 키보드 높이 구하기 (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 |
Navigation Component 에서 그래프 여러개 관리하기 (0) | 2022.12.11 |
멀티모듈로 배포할때 파이어베이스 관련 이슈 (0) | 2022.11.06 |
Comments