Android 如何在ViewModel中安全关闭数据库?

Android 如何在ViewModel中安全关闭数据库?,android,kotlin,android-sqlite,kotlin-coroutines,android-viewmodel,Android,Kotlin,Android Sqlite,Kotlin Coroutines,Android Viewmodel,我的Android应用程序有一个ViewModel,它使用Kotlin协程执行SQLite数据库操作 如果ViewModel的片段在DB操作运行时关闭,我希望确保DB正确关闭,这样就不会出现泄漏。为了确保在数据库仍在使用时不会关闭它,我首先取消ViewModel作业,然后调用DB.close() 但是,如果在操作仍在执行时关闭片段,则会出现以下错误: IllegalStateException:无法执行此操作,因为连接池已关闭。 如何取消正在运行的作业,以便安全地关闭数据库 视图模型: clas

我的Android应用程序有一个ViewModel,它使用Kotlin协程执行SQLite数据库操作

如果ViewModel的片段在DB操作运行时关闭,我希望确保DB正确关闭,这样就不会出现泄漏。为了确保在数据库仍在使用时不会关闭它,我首先取消ViewModel作业,然后调用DB.close()

但是,如果在操作仍在执行时关闭片段,则会出现以下错误:

IllegalStateException:无法执行此操作,因为连接池已关闭。

如何取消正在运行的作业,以便安全地关闭数据库

视图模型:

class MyViewModel(
        private val db: DatabaseHelper,
) : ViewModel() {

    private var viewModelJob = Job()
    private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)

    init {
        initialize()
    }

    override fun onCleared() {
        super.onCleared()
        viewModelJob.cancel()
        db.close()
    }

    private fun initialize() {
        uiScope.launch {
            runQuery()
       }
    }

    private suspend fun runQuery() {
        return withContext(Dispatchers.IO) {
            //Perform long-running db operations
        }
    }
}

堆栈跟踪指向runQuery()函数中的操作,这些操作在数据库关闭后仍在运行。我不明白当我关闭数据库时该操作是如何运行的,因为我已经调用了
viewModelJob.cancel()

super.onCleared()之前尝试
db.close()
,仍然得到相同的结果