Android Room Relation and Embedded

사용 언어: Kotlin 1.9.22
사용 버전: Android Studio Iguana 2023.2.1


안드로이드 Room Relation and Embedded를 알아보겠습니다.





Room database는 관계형 데이터베이스로 다른 table(테이블)과 상호작용해야 할 때가 있습니다.
이러한 경우 사용할 수 있는 방법이 Intermediate data class와 Multimap return types가 있습니다.
Room은 버전 2.4 이상부터는 Multimap return types만 지원합니다. 따라서 여기서는 Multimap return types만 다루도록 하겠습니다.


아래는 공식 문서입니다.
https://developer.android.com/training/data-storage/room/relationships


Multimap(멀티맵)의 경우 추상화 자료형을 만들어 추가적으로 data(데이터) class(클래스)를 만들 필요가 없어서 좋습니다. 단지 추상화된 map structure만 있으면 됩니다.



@Embedded는 다른 data class를 그대로 가져다 쓸 때 사용합니다.





위의 User는 id, firstName, street, state, city, postCode를 가지게 됩니다.





@Relation의 경우에는 one-to-one(일 대 일), one-to-many(일 대 다), many-to-many(다 대 다) 관계에 사용됩니다.

one-to-one의 경우 쉽습니다.



아래의 data class가 정의되어 있을 때,





두 data를 연결하게 되면 아래와 같이 표현 가능합니다.




parentColumn에는 User가 Library를 가지므로 Primary key(기본 키)인 UserId가 적히고,

entityColumn에는 자식인 Library의 Foreign key(외래 키)인 userOwnerId가 적힙니다.





그리고 해당 data를 불러오기 위해 Query는 다음과 같이 Transaction을 사용해서 부릅니다.






one-to-many는 one-to-one과 비슷합니다.







다른 점은 결과가 List로 온다는 것입니다.









many-to-many 관계에서는 연결해 주는 CrossRef data class를 만들어줍니다.







아래와 같은 방법으로 associatedBy와 Junction을 사용합니다.





Dao는 이렇게 정의합니다.







만약 @Relation이 적합하지 않다면, Sqlite의 JOIN을 사용하여 직접 합쳐도 됩니다.






Nested relationships(다중 관계)는 속도 문제로 장려하지는 않습니다.

one-to-many와 many-to-many를 하나로 합치는 과정을 봅시다.







처음에는 many-to-many로 시작합니다.






이제, one-to-many로 합쳐야 하는데, 여기서는 Relation의 entity를 사용합니다.





그럼, 전체 그림은 이렇게 됩니다.





Dao는 다음과 같습니다.






실제로 사용해 봅시다.



FavoriteWithAirports.kt

FavoriteWithAirports를 data class로 정의합니다.

departure_code와 destination_code로 airport에서 불러옵니다.

one-to-one 관계라서 딱히 손댈 것은 없습니다.






이렇게 실제로 사용하는 data class로 변환하는 확장 함수도 만들어 줍니다.







FavoriteDao.kt

이렇게 Transaction을 적어주고, getFavoriteWithAirports를 만들어 줍니다.





AllFlightsRepository.kt

getAllFavoriteFlightsStream에 사용합니다.





참고 프로젝트:




끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)