Android: Kotlin Room如何从表中获取唯一数据并在循环视图中使用它



我有一个包含课程的表,我需要从中选择所有唯一的组名,以便在循环视图中显示

课数据类

@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()) }

最新更新