class DetailRepository(private val workoutDao : WorkoutDao, title: String) {
private val workout = Workout(title = title)
private var setInfoList = ArrayList<WorkoutSetInfo>()
private lateinit var updatedList : List<WorkoutSetInfo>
fun changeUnit(unit: WorkoutUnit) {
updatedList = setInfoList.map { setInfo ->
setInfo.copy(unit = unit)
}
}
fun add() {
setInfoList.let { list ->
val item = WorkoutSetInfo(set = setInfoList.size + 1)
list.add(item)
updatedList = setInfoList.toList()
}
}
fun delete() {
if(setInfoList.size != 0) {
setInfoList.let { list ->
list.removeLast()
updatedList = list.toList()
}
}
return
}
fun save() {
val workoutId = workoutDao.insertWorkout(workout) // Workout 삽입 및 삽입된 Workout의 ID 반환
val newWorkoutSetInfoList = setInfoList.map { setInfo -> // workoutId를 기반으로 새 리스트 리턴
setInfo.copy(parentWorkoutId = workoutId)
}
workoutDao.insertSetInfoList(newWorkoutSetInfoList)
setInfoList.clear()
}
fun clear() {
setInfoList.clear()
updatedList = setInfoList.toList()
}
// toList를 하는 이유는 새로운 리스트를 반환하기때문에 postValue 가능하게끔 하기 위함
fun getList() : List<WorkoutSetInfo> = updatedList
}
ViewModel
class DetailViewModel(val repository: DetailRepository, title: String) : ViewModel() {
private var _items: MutableLiveData<List<WorkoutSetInfo>> = MutableLiveData()
var testNum : Int = 0
val items: LiveData<List<WorkoutSetInfo>>
get() = _items
fun changeUnit(unit: WorkoutUnit) {
repository.changeUnit(unit)
_items.postValue(repository.getList())
}
fun addSet() {
viewModelScope.launch(Dispatchers.IO){
repository.add()
_items.postValue(repository.getList()) // plus를 사용하면 새로운 List가 반환
}
}
fun deleteSet() {
repository.delete()
_items.postValue(repository.getList())
}
fun save() {
viewModelScope.launch(Dispatchers.IO) {
repository.save()
}
}
fun clear() {
viewModelScope.launch(Dispatchers.IO){
repository.clear()
_items.postValue(repository.getList())
}
}
}
위 코드처럼 repository에서 workout이라는 데이터와 setinfolist를 생성하고
뷰모델에서 사용해서 화면을 업데이트합니다.
이전 질문의 답변에서 화면단위 임시 입력은ViewModel 에서, db같은 곳에 영구저장하는 건 repository에서 하시는게 적합해보이신다고 하셨는데
그럼 지금 현재 Repository에 있는 Workout, setInfoList같은 데이터를 생성하는 코드를 Repository가 아니라
Viewmodel에서 진행하고 DB에 저장할때는 Repo로 옮겨서 하라 이말씀인가요?.
이렇게 ㄷ데이터의 생성같은것을 Repo가 아니라 ViewModel에서 직접하고 해해도 괜찮으을까요?
뭐 mvvm의 관점이나 이런것에서요.
--
아 그리고 nested_graph를 사용해서 by activityviewmodel이나 by navGraphViewmodel()을 사용하라고 하시는 것도 추천하시던데..이전에 그걸 사용하는데 그.. 데이터가 자꾸 공유가 돼서 그냥 일반
by viewmodels()를 사용하는 다른 방법으로 바꿨습니다 ㅠ