다른 글

2020.08.23 - [언어, 라이브러리/Android] - [Android, Kotlin] Room을 활용한 데이터베이스 구축

 

 

오류내용

Room으로 데이터베이스 구축 후 쿼리 사용 시 아래 오류 발생

 

Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

 

 

원인

안드로이드는 데이터베이스 쿼리가 메인스레드를 점유할것을 염려하여 메인스레드가 아닌 다른 스레드에서 쿼리를 실행할 것을 강요한다.

 

 

해결 방법

방법1 : 메인스레드에서 강제 실행

방법2 : 새로운 스레드 생성

방법3 : 코루틴 사용

 

안드로이드가 권장하지 않는 방법1을 사용할 이유는 없으며 방법2의 컨텍스트스위칭 시간을 줄이기 위해 나온것이 방법 3이므로 방법 3을 이용한다.

 

쿼리를 CoroutineScope 내부에 작성한다.

아래 코루틴은 IO 스레드를 사용한다.(Dispatchers.IO)

 

val personDb = PersonDatabase.GetInstance(this)
val input = PersonTable(1, "mark", 20)
CoroutineScope(Dispatchers.IO).launch {
    personDb?.personDao()?.Insert(input)
    Log.d("test", "${personDb?.personDao()?.GetAll()}")
}