데이터베이스 생성하고 Entity 작성하기

nbh·2023년 11월 28일

개인적으로 기록하기 위한 용도의 포스팅으로,
잘못된 정보가 들어있을 수 있습니다.
참고용으로만 봐주세요.

데이터베이스 작성하기

요구사항 확인하기

내가 데이터베이스를 통해 어플에서 구현하고 싶은 것은
Album fragment에서 곡의 정보를 통해 곡이 속한 앨범의 곡 목록을 불러오는 것이었다.
말이 좀 꼬였는데
A 앨범에 속한 a라는 노래를 클릭하면, Album fragment가 나오면서 UI의 Recycler View의 목록에 A 앨범이 가지고 있는 모든 노래를 출력하고 싶었다.

그런 시스템을 만들기 위해서 데이터베이스에는
1. 앨범
2. 곡
두 테이블이 필요하고,
앨범과 곡이 외래 키로 1:n으로 매칭되어야했다.

각 테이블은 다음과 같은 정보를 가졌다.
1. 앨범

  • 앨범 이름
  • 아티스트 이름
  • 앨범 커버 이미지
  • ID (기본 키)
  • 앨범 이름 (외래키)
  • 트랙 넘버
  • 곡 이름

여기서 ID는 기본 키로 설정하기 위해서 넣었는데, 나중에 '앨범 이름과 곡 이름으로 각 요소가 구분이 된다면 굳이 ID라는 기본 키를 가지고 있을 필요는 없다'라는 조언을 받았다.

들어있는 데이터의 예시는 아래와 같다.


RoomEntity.kt 작성하기

데이터베이스를 Room으로 어플과 연동하기 위해선 우선 만든 데이터베이스와 같은 Entity를 가진 data class를 만들어야한다.
그리고 @Entity, @PrimaryKey, @ColumInfo 등등 알맞은 어노테이션을 써주어야한다.

전체 코드는 아래와 같고,

@Entity(
    tableName = "Song",
    foreignKeys = [
        ForeignKey(
            entity = AlbumEntity::class,
            parentColumns = arrayOf("name"),
            childColumns = arrayOf("albumName")
        )
    ]
)
data class SongEntity(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo
    var ID: Long = 0,

    @ColumnInfo
    var trackId: Long? = 0,

    @ColumnInfo
    var name: String? = "",

    @ColumnInfo
    @ForeignKey(
        entity = AlbumEntity::class,
        parentColumns = ["name"],
        childColumns = ["albumName"]
    )
    var albumName: String? = ""



)

@Entity(tableName = "Album")
data class AlbumEntity(
    @PrimaryKey(autoGenerate = false)
    @ColumnInfo
    var name: String = "",

    @ColumnInfo
    var artist: String = "",

    @ColumnInfo
    var coverImage: Bitmap? = null,
)

data class AlbumWithSongs(
    @Embedded
    val album: AlbumEntity,
    @Relation(
        parentColumn = "name",
        entityColumn = "albumName"
    )
    val songLists: List<SongEntity>
)

data class SongWithAlbum(
    @Embedded
    val song:SongEntity,
    @Relation(
        parentColumn = "albumName",
        entityColumn = "name"
    )
    val album: AlbumEntity
)

이 중 눈여겨 봐야 할 부분은
1. 필드 속성 맞추는 법

  • 타입 맞추기
    TEXT : String
    INTEGER : Long
    BLOB : Bitmap
  • 속성 맞추기
    NN(Non Null): 변수명 뒤에 ?를 붙여 nullable로 만들면 false, 아니라면 true
    PK(Primary Key): @PrimaryKey라는 어노테이션을 넣는다

2.변수 이름과 필드 이름 맞춰주기
변수 이름과 필드 이름을 동일하게 설정했지만, 두 개를 다르게 설정할 수도 있다. 각 필드에 매칭되는 변수를 선언하기 위해 한 줄 위에 @ColumnInfo라는 어노테이션을 달아줘야하는데,
@ColumnInfo(name="필드 이름")
과 같이 작성해주면 된다.

3 각 테이블관의 관계 설정하기
외래키를 설정하는 방법이다. @Entity 어노테이션에서 괄호()를 열고 다음과 같이적어주면 된다.

@Entity(
    tableName = "테이블 이름",
    foreignKeys = [
        ForeignKey(
            entity = 관계를 맺는 엔티티 클래스 이름::class,
            parentColumns = arrayOf("부모 필드"),
            childColumns = arrayOf("자식 필드")
        )
    ]
)

그리고 외래키 컬럼 변수 위에 @ColumnInfo와 함께 @ForeignKey 어노테이션에 다음과 같이써주면 된다.

@ColumnInfo
@ForeignKey(
	entity = 관계를 맺는 엔티티 클래스 이름::class,
	parentColumns = ["부모 필드"],
	childColumns = ["자식 필드"]
)
var albumName: String? = ""

0개의 댓글