마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

companion object는 DB에 저장이 안되나요?

0 추천

사진이 UI 모델이구요.

@Entity
data class Detail(
    @PrimaryKey(autoGenerate = true)
    var id: Int,
    val set: Int,
    var weight: String = "",
    var reps: String = "") {

    companion object {
        var title: String = ""
        var unit: String = "kg"
        val memo = ""
    }
}

위 UI에 대한 Entity 모델은 이렇게 설정했습니다.

어떤 버튼을 누르면 사진의 Detail을 작성하는 페이지로 넘어갑니다.

이렇게 작성하게 Detail 클래스를 만든 경위는 

보시다시피  Detail을 작성하는 페이지에서 

빨간색 박스의 set, weight, reps는 여러개가 존재해야하지만

파란색박스의 title과 unit, memo는 단 하나만 생성하면 됩니다.

이러한 생각에 companion object로 설정을 했습니다

따라서 빨간색 박스의 아이템들을 추가하기위해 set추가 버튼을 눌렀을때 

Detail 클래스가 생성되어도 companion object 이기에 여러개가 생성되지 않죠.

 

근데 이제보니 최종적으로 작성을하고 저장을 누른후

IDE에서 Database Inpector를 보니 딱 companion object 프로퍼티만 들어가있지않네요..

원래 안들어가나요? 아니면 제가 뭔가 놓친게 있는걸까요?

 

원래 안들어가는것이라면 Entity의 설계부터 다시 해야할것같은데 

이전에 했던 sealed 클래스로 묶는 방법을 다시 써야할지 고민이네요..

Detail 클래스에 title, unit, memo를 프로퍼티로 설정하는것은 전혀 아닌것같구요..

codeslave (3,940 포인트) 님이 2022년 3월 31일 질문
codeslave님이 2022년 3월 31일 수정
참고로 님과 같이  Room Entity 에서 companion object를 써서 필드를 저장하는 코드는 아직 본 적이 없네요. Room이 인식을 못할 거예요.

1개의 답변

0 추천

말씀하신 용도로  global static 변수를 사용하는 건 바람직해보이지 않습니다. 

빨간색 박스의 set, weight, reps는 여러개가 존재해야하지만 파란색박스의 title과 unit, memo는 단 하나만 생성하면 됩니다.

위와 같다면, 클래스 안에 List를 포함하는 구조가 되는 것이 합리적으로 보입니다.

data class WorkoutSetUiEntity (
    val id: Int, 
    val title: String = ""
    val unit: String = "kg"
    val memo: String = ""
    val sets: List<WorkoutSetItemUiEntity> = emptyList()
)

data class WorkoutSetItemUiEntity (
    val id: Int,
    val set: Int,
    val weight: String = "",
    val reps: String = ""
)

 

위와 같이 화면의 입력을 저장할 데이터클래스들을 DB Entity 와는 별개로 만들고, 저장시에는 먼저 DB Entity로 변환한 다음 저장하는 것이 나을 것 같습니다. 화면과 DB의 구조가 다른데 억지로 DB Entity를 화면을 위해 사용하면 여러가지가 꼬이게 됩니다.
물론 DB에서 데이터를 가져올 때는 역으로 DB Entity를 위의 클래스 구조로 변경하셔야 겠죠.

spark (227,470 포인트) 님이 2022년 3월 31일 답변
spark님이 2022년 3월 31일 수정
...