Android Room database embedded and relation

사용 언어: Kotlin 2.3.0
사용 버전: Android Studio Otter 2 Feature Drop | 2025.2.2

안드로이드 Room database embedded and relation을 알아보겠습니다.


Room에서는 임베디드(Embedded)와 릴레이션(Relation)이라는 에너테이션(Annotation)을 제공해 줍니다.







먼저 @Embedded 먼저 살펴봅시다.

Embedded에 대한 문서는 아래에 있습니다.


처음 사진에 있는 코드를 보면 NewsResourceEntity라는 것을 Embedded 합니다.




이 의미는 Sqlite로 매핑(mapping) 할 때 NewsResourceEntity의 필드(Field) 값을 PopulatedNewsResource의 Field에도 동일하게 사용하겠다는 뜻입니다.



그러면 PopulatedNewsResource의 Field는 id, title, content, url, header_image_url, publish_date, type, topics로 구성되겠네요.







다음으로 볼 것은 @Relation입니다.

Relation 문서는 여기 있습니다.


parentColumn에 들어간 "id"는 PopulatedNewsResource에 있는 id를 사용하겠다는 말입니다.

entityColumn에 들어간 "id"는 TopicEntity에 있는 Id를 사용하겠다는 말입니다.

associatedBy에는 정션(Junction)을 사용했는데 이는 조인(Join)을 어떻게 할 것인지를 정의합니다.



Junction의 문서는 여기 있습니다.



value는 Junction에 사용되는 엔티티(Entity) Class를 적어줍니다.

parentColumn에는 주체가 되는 칼럼(Column) 이름

entityColumn에는  연결되는 Column 이름



아래는 Junction에 사용되는 NewsResourceTopicCrossRef Entity입니다.




tableName은 테이블(table) 이름을 설정합니다.

primaryKeys는 프라이머리(Primary) key를 설정합니다.

foreignKeys는 외래 키(foreign key)를 설정합니다.

    - entity에는 연결할 Entity class를 적어줍니다.

    - parentColumns에는 entity에 적은 Entity class의 field를 적어줍니다.

    - childColumns에는 현재 Entity class의 field를 적어줍니다.

    - onDelete에는 연결되어 있는 Field가 변경될 시의 행동을 정의합니다.

indices는 검색 속도를 향상시킬 인덱스(Index)를 설정합니다.





다시 처음으로 돌아와서 아래 코드의 결과는 다음과 같습니다.





PopulatedNewsResource는 entity라는 값에는 NewsREsourceEntity 객체가 들어갑니다.

topics에는 위의 Junction을 통해 entity에 있는 NewsResourceEntity.id 값을 가진 NewsResourceTopicCrossRef 테이블의 news_resource_id를 찾고 거기에 해당되는 모든 topic_id를 가지고 TopicEntity.id를 검색하여 TopicEntity를 반환합니다.

news_resource_id는 복수의 topic_id를 가질 수 있으므로 topics에는 List<TopicEntity>가 들어가게 됩니다.





아래는 실제 생성되는 객체 모양입니다.

PopulatedNewsResource(entity=NewsResourceEntity(id=82, title=I/O 22, url=23:00:00Z, type=Video 📺), topics=[TopicEntity(id=1, name=Headlines, shortDescription=News, longDescription=Android development., url=, imageUrl=a2fb996603f), TopicEntity(id=10, ...)])



끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

iOS Error Undefined symbol Testing.Trait

Python urllib.parse.quote()

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

일본어 문장부호

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

tensorflow tf.expand_dims()

Forensics 인터넷 다운로드 파일 출처 확인하기

Android Notification with Full Screen

음악 총보(Score), 파트보(Part)

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