Android

Android Room Entity Relation

최데브 2023. 12. 2. 11:20

 

프로젝트를 하다보면 서버를 거칠 필요없이 앱 내부에서만 사용하는 데이터를

관리하고 싶을때가 있다.

  • 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>>

 

쉽다.

반응형