
이러한 화면을 만들고 있고.. 지난번 말씀해주신대로
WorkoutSetInfo
data class WorkoutSetInfo(
val id: String = UUID.randomUUID().toString(), // UUID 비교를 위한 ID
val set: Int,
val weight: String = "",
val reps: String = ""
)
Workout
@Entity
data class Workout(
@PrimaryKey(autoGenerate = true)
val id: Int,
val title: String = "",
val unit: String = "kg",
val memo: String = "",
var sets: List<WorkoutSetInfo> = emptyList()
)
이런식으로 Entity를 구성을 했고
TypeConverter
class Converter {
@TypeConverter
fun listToJson(value: List<WorkoutSetInfo>) : String {
return Gson().toJson(value)
}
@TypeConverter
fun jsonToList(value: String) : List<WorkoutSetInfo> {
return Gson().fromJson(value, Array<WorkoutSetInfo>::class.java).toList()
}
}
DAO
@Dao
interface WorkoutDao {
@Query("SELECT sets FROM Workout")
fun getWorkoutSetInfoList() : LiveData<List<WorkoutSetInfo>>
@Insert
fun insert(workout: Workout)
}
Repository
class WorkoutRepository(private val workoutDao : WorkoutDao, title: String) {
val workout = Workout(0, title)
var setInfoList : ArrayList<WorkoutSetInfo> = arrayListOf()
val _items: LiveData<List<WorkoutSetInfo>> = workoutDao.getWorkoutSetInfoList()
fun add(item: WorkoutSetInfo) {
setInfoList.add(item)
workout.sets = setInfoList
workoutDao.insert(workout)
}
}
ViewModel
class DetailViewModel(application: Application, title: String) : ViewModel() {
private val repository: WorkoutRepository
private lateinit var _items: LiveData<List<WorkoutSetInfo>>
val items = _items
private val list: List<WorkoutSetInfo>
get() = _items.value ?: emptyList()
init {
val workoutDao = DetailDatabase.getDatabase(application)!!.workoutDao()
repository = WorkoutRepository(workoutDao, title)
_items = repository._items
}
fun addDetail() {
viewModelScope.launch(Dispatchers.IO){
val item = WorkoutSetInfo(set = list.size+1)
repository.add(item)
}
}
}
이렇게 짰는데..
error: The columns returned by the query does not have the fields [id,title,unit,memo] in com.example.lightweight.data.db.entity.Workout even though they are annotated as non-null or primitive. Columns returned by the query: [sets]
public abstract androidx.lifecycle.LiveData<com.example.lightweight.data.db.entity.Workout> getWorkoutSetInfoList();
해당 에러를 얻었습니다..
뭐가 원인일까요? 코드가 지금 중구난방이라... 저도 뭐가 어떻게 되어가고 있는지 모르겠습니다.
추가로 DB 설계와 관련해서 Workout 내에 WokroutSetInfo 를 넣는 형식으로 Entity를 작성하라고 하셨는데,
아래 그림이 제가 최종적으로 만들 제가 생각해본 UI DB 방향 정도입니다..

날짜별로 운동을 작성을 합니다. 작성하는 부분은 초록색 박스와 파란색 박스입니다.,
작성을 완료하면 최종적으로 빨간색 박스에 저장 되겠죠.
즉 빨간 박스 테이블에는 날짜별로 진행한 운동 일지들이 모여있고,
각각 날짜별 튜플?레코드?에는
파란색박스(Work)이 여럿 존재하는 형태가 될텐데요.
지금 코드로 작성하고 있는 부분이 파란색 박스(Workout)과 초록색 박스(WorkoutSetInfo)입니다
지금은 위 그림과 달리
WorkoutSetInfo를 Workout 내부에 저장하는 식으로해서 하나의 테이블을 사용하고 있는 형태일텐데요..
궁금한것이 위 그림처럼 두개의 테이블을 사용하는것을 별로인가요?
벤치프레스라는 Workout을 예를들면
지금은 벤치프레스라는 Workout 내부에 WorkoutSetInfo 리스트가 존재합니다.
테이블로 보면 Workout 테이블의 벤치프레스 튜플(레코드)에 WorkoutSetInfo가 속성(필드)로 존재하겠죠..
그런데 이걸 나뉘어서 Workout 테이블과 WorkoutSetInfo 테이블을 나뉘어서
WorkoutSetInfo에서는 Workout의 벤치프레스 ID를 가지고 접근을 하는겁니다..
두개의 테이블을 사용하는 것이죠..
이렇게 생각도 해보았는데 이게 더 복잡한 형태가 될까요?
에러를 해결하지 못하다보니 자꾸 엉뚱한 방향으로 생각을하게되네요..
에러에 대한 해결방법과 위 DB설계도 괜찮은 방법인지 부탁드립니다 ㅠ