[코드 리팩토링] '미주정복' 7일차 - LiveData 수정, DividendScreen

이윤진·2024년 1월 22일
0

코드 리팩토링

목록 보기
8/12

지난 포스트 에러

LiveData를 Room에 삽입하는 과정에서 에러가 나서 LiveData에서 String으로 변경하는 부분에서 에러가 발생하는 것이라고 생각했는데 로그를 찍어 확인해보니, View에서 ViewModel로 제대로 데이터가 전달되고 있지 않았다.
viewModel._stockName.postValue(name)
이렇게 View에서 ViewModel로 전달하고 있었다.
https://www.codeproject.com/Questions/5331445/How-to-pass-a-string-from-view-to-the-viewmodel-in
위의 글을 보니, View에서 ViewModel로 데이터를 보낼 때는 그냥 함수를 통해서 보내는 것 같다. 따라서 아래와 같이 바꾸었다.

/*********정보 저장*********/
viewModel.insert(
    StockData(
        0,
        name,
        quantity,
        exchange,
        price,
        dividend
    )
)
/*********보유 달러 업데이트*********/
viewModel.updateHoldingdollar(
    price, quantity
)

코드를 실행 시키면 아래와 같이 데이터베이스에 값이 잘 들어와 있는 것을 확인할 수 있다.


그러나? 데이터 값은 잘 오는데 이를 파싱하는 과정에서 문제가 생긴 것 같다.
값이 이미 string이기에 그냥 대입하면 되는데 코드를 "$stockList.price"이런 식으로 적어서 생긴 문제였다. 그냥 stockList.price로 변경해주니 잘 작동하였다.

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
이와 같은 문제가 또 생겼는데 이는 내가 Room의 데이터 클래스의 primary key를 변경해서 생긴 문제였다. 이미 내가 이전 형식으로 넣어놓은 데이터가 있는데 그 데이터를 바뀐 형태로 부르니 문제가 생긴 것이다.
Android Studio를 다시 실행해서 고쳤다.

이전 DividendScreen 구조

  1. compose 함수
  2. 서버 연결 메서드
  3. BarChart 구현

바뀐 DividendView 구조

DividendScreen의 파일 명과 함수 명을 DividendView로 변경하였다.
DividendViewModel을 생성하여 데이터를 다루는 메서드를 이곳으로 옮겨주었다.

    private val _dollar = MutableLiveData<String>()
    val dollar : LiveData<String> get() = _dollar

    private val _stockNameList = MutableLiveData<List<String>>()
    val stockNameList : LiveData<List<String>> get() =  _stockNameList

    fun getDollar() = CoroutineScope(Dispatchers.IO).launch {
        _dollar.postValue(userDao.getHoldingdollar().toString())
        Log.i("room", "${userDao.getHoldingdollar()}")
    }

    private fun getStockNameList() = CoroutineScope(Dispatchers.IO).launch {
        _stockNameList.postValue(stockDao.getAllStockName())
    }

주식 이름 리스트와 보유 달러를 가져오는 LiveData와 함수를 만들었다.

    /************배당 목록 가져오기************/
    viewModel.stockNameList.observe(LocalLifecycleOwner.current){
        for (stockName in it){
            stockNameList.add(stockName)
        }
    }

observe를 통해 값을 받아와서 view에서 출력할 수 있도록 하였다.

다음에 DividendDialog와 DividendHistoryActivity를 리팩토링하면 이 프로젝트의 리팩토링은 끝날 것 같다.

profile
Android/Flutter 개발

0개의 댓글