我有一个包含课程的表,我需要从中选择所有唯一的组名,以便在循环视图中显示
课数据类
@Entity(tableName = "lesson_table")
data class Lesson (
@PrimaryKey(autoGenerate = true) val id: Int?,
@ColumnInfo(name = "lesson_name") val lessonName: String?,
@ColumnInfo(name = "Group_name") val groupName: String?,
@ColumnInfo(name = "day") val day: Int?
)
LessonDAO
@Dao
interface LessonDao {
@Query("SELECT * FROM lesson_table")
fun getAll(): List<Lesson>
@Query("SELECT DISTINCT Group_name FROM lesson_table")
fun findallgroup(): List<Lesson>
在片段代码中插入数据到rcview
private fun init(){
binding.apply {
gridLayoutManager = GridLayoutManager(requireContext(), 2, LinearLayoutManager.VERTICAL, false)
rcView.layoutManager = gridLayoutManager
rcView.adapter=adapter
}
GlobalScope.launch { adapter.addItems(appDb.lessonDao().findallgroup())}
}
它不起作用,但如果我使用DAO的getAll(),它就起作用了请帮助
注:如果我使用findallgroup()我得到错误
E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
Process: com.example.calendar2, PID: 5833
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
不要使用GlobalScope
。您应该使用生命周期作用域,以便将其绑定到主线程,这在使用任何UI组件时都是必需的。当视图被销毁时,生命周期作用域也会自动取消它的协程,这避免了内存泄漏或在试图引用不再存在的视图时导致崩溃。
在Activity中:
lifecycleScope.launch { adapter.addItems(appDb.lessonDao().findallgroup()) }
在Fragment中:
viewLifecycle.lifecycleScope.launch { adapter.addItems(appDb.lessonDao().findallgroup()) }