데이터베이스 - Room 쓸때 DAO에서 반드시 LiveData를 반환해야하나요? - 안드로이드 Q&A (masterqna.com)
앞전에 원인을 모르는 Room 에러가 떴다고 질문드렸었는데, 그때 해결 못하고
결국 뭐가 원인인지 찾으려고 commit을 앞으로 뭐가문제인지 찾으려고 되돌려서 다시 진행했습니다.
앞 커밋에서 진행한게 필요없는 클래스 삭제 및 주석쳤던 코드삭제 필요없는 코드 삭제 같은걸 진행했었고 추가로 Navigation Destination 같은것을 추가삭제했습니다.
다른데는 문제가 없었고 Destination의 추가삭제하면서 이번에 또 똑같은 에러가 발생하는걸 알수 있었습니다. 이유는 모르겠습니다.
Bottom Navigation에서 Navigation을 변경하려고 Destination을 새로 추가했습니다.,
좀 더 자세히 설명 드리면
![](http://www.masterqna.com/android/?qa=blob&qa_blobid=14049589428955870909)
------------------------------------------------------------------------------------------
에러 (이전글 복사)
처음에는 Entity 클래스에서
error: Cannot find setter for field.
private final long workoutId = 0L;
|
이러한 에러를 띄웠습니다.
건드리지도 않은 코드의 에러가 왜 뜨는지 도저히 이해가 안갔지만
android - Cannot find setter for field - using Kotlin with Room database - Stack Overflow
참고해서 val을 var로 변경했습니다.
그후 실행하니
error: Not sure how to convert a Cursor to this method's return type (java.lang.Object).
public abstract java.lang.Object getWorkoutList(@org.jetbrains.annotations.NotNull()
이러한 에러를 띄웠습니다.
검색 결과
android - Room "Not sure how to convert a Cursor to this method's return type": which method? - Stack Overflow
여기서 suspend를 제거하라해서 했습니다. LiveData도 사용하라고 한것 같지만 이전에는 없어도 잘 동작되어서 일단 진행했습니다.
error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
kotlin.coroutines.Continuation<? super kotlin.Unit> continuation);
---------------------
Workout
@Entity
data class Workout(
@PrimaryKey(autoGenerate = true)
val workoutId: Long = 0,
val title: String = "",
val memo: String = "",
)
WorkoutListDao
@Dao
interface WorkoutListDao {
@Query("SELECT * FROM WorkoutList")
suspend fun getWorkoutList() : WorkoutList
@Insert
suspend fun insertWorkoutList(workoutList: WorkoutList)
}
DetailViewModel
class DetailViewModel(application: Application, title: String) : ViewModel() {
private val workoutDao = DetailDatabase.getDatabase(application).workoutDao()
private val repository: WorkoutRepository = WorkoutRepository(workoutDao, title)
private val _items: MutableLiveData<List<WorkoutSetInfo>> = MutableLiveData()
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())
}
}
fun deleteSet() {
repository.delete()
_items.postValue(repository.getList())
}
fun save() {
viewModelScope.launch(Dispatchers.IO) {
repository.save()
}
}
}
WorkoutListViewModel
class WorkoutListViewModel(application: Application) : AndroidViewModel(application){
private var _list = MutableLiveData<List<String>>(arrayListOf())
private val workoutDao = WorkoutListDatabase.getDatabase(application).workoutListDao()
private val workoutListRepo = WorkoutListRepository(workoutDao)
val list: LiveData<List<String>>
get() = _list
fun getList(part: BodyPart) {
viewModelScope.launch(Dispatchers.IO) {
val result = workoutListRepo.getWorkoutList(part)
_list.postValue(result)
}
}
}
WorkoutRepository
class WorkoutRepository(private val workoutDao : WorkoutDao, title: String) {
private val workout = Workout(title = title)
private var setInfoList = ArrayList<WorkoutSetInfo>()
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)
val newWorkoutSetInfoList = setInfoList.map { setInfo ->
setInfo.copy(parentWorkoutId = workoutId)
}
workoutDao.insertSetInfoList(newWorkoutSetInfoList)
}
fun getList() : List<WorkoutSetInfo> = updatedList
}
WorkoutListRepository
class WorkoutListRepository(private val workoutListDao: WorkoutListDao) {
suspend fun getWorkoutList(part: BodyPart) : List<String> {
val partList = workoutListDao.getWorkoutList()
return when(part) {
is BodyPart.Chest -> partList.chest
is BodyPart.Back -> partList.back
is BodyPart.Leg -> partList.leg
is BodyPart.Shoulder -> partList.shoulder
is BodyPart.Biceps -> partList.biceps
is BodyPart.Triceps -> partList.triceps
is BodyPart.Abs -> partList.abs
}
}
}