본문 바로가기
내일배움캠프 (스파르타 코딩 클럽) 안드로이드 2기/TIL

룸 디비 연결 후에 나타난 에러 트러블 슈팅 과정

by 키윤 2024. 3. 7.

1. 첫 오류

챗봇 프래그먼트로 이동 자체가 안되는 이쓔가 있었다.

java.lang.ClassCastException: android.app.Application cannot be cast to com.mit.offroader.ui.fragment.chatbot.ChatBotApplication

// ChatBotFragment:
    private val chatBotViewModel: ChatBotViewModel by viewModels {
        ChatBotViewModelFactory((requireActivity().application as ChatBotApplication).repository)
    }
// ChatBotApplication:
package com.mit.offroader.ui.fragment.chatbot

import android.app.Application
import com.mit.offroader.ui.fragment.chatbot.database.ChatBotDatabase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob

class ChatBotApplication: Application() {

    val applicationScope = CoroutineScope(SupervisorJob())

    val database by lazy { ChatBotDatabase.getDatabase(this, applicationScope)}
    val repository by lazy { ChatBotRepository(database.getChatBotDao())}
}

해결 : manifest application안에 이름 정의해주기

2. 다시 실행하니 다른 오류 발생

Cannot find implementation for com.mit.offroader.ui.fragment.chatbot.database.ChatBotDatabase. ChatBotDatabase_Impl does not exist

해결:

아래 implementation 추가

kapt ("androidx.room:room-compiler:2.6.1")

룸디비 값에 저장 성공 !

3. 뷰모델이랑 룸이랑 연결 성공하고 이제 리사이클러뷰에 잘 넣어보려고 하는데 리사이클러뷰가 나타났다가 바로사라지는 문제가 있음. (ㄹㅇ챗버블이 깜빡깜빡임)

오 그런데 바로 다시 나타남..

이게 뭐징.

다른 프래그먼트에 갔다가 다시 챗봇 프래그먼트에 돌아오면 정상적으로 디비에 값이 저장되어있음을 확인할 수 있다. 지금 프래그먼트 내부 라이프사이클을 한번 다시 정리해봐야할듯?

해결 : 챗 입력값을 object에서도 저장하고 데어터베이스에서도 저장해서 일어났던 문제욨다. 그냥 내가 바보..

4. DB 구조 수정 → MIGRATE하라고 뜸

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.

clear project & Invalidate caches 둘다 해봤지만 해결해주지 않음. 다연한게 캐시에 저장안하려고 DB 쓴건데 그거 지운다고 바뀔까..

DB 버전을 Migrate하거나 DB 저장 내역을 지워야함.

How To Reset Room DB Completely (Including Primary Keys) | Android

위에 링크에 상세하게 나와있는데 어떻게하는건지 모루겠음..

2시간 고민하고 찾아봤는데 그냘앱 지웠다 깔면 됨. 허무하다.. 원래 무슨에러 고치고 있었는지도 까머금..