【问题标题】:Room database. How to get LiveData from a nested query?房间数据库。如何从嵌套查询中获取 LiveData?
【发布时间】:2020-01-23 09:09:12
【问题描述】:

我有相当简单的数据模型 TimeSlot -> Subject -> Teacher。我的目标是制定学校每周的时间表。因此,在 SQL 中,它将是 SELECT * FROM TimeSlot、Subject、Teacher WHERE TimeSlot.subject_id = Subject.subject_id AND Subject.teacher_id = Teacher.teacher_id。但我需要一个带有卡片的 RecyclerView,其中所有时间段都有科目和合适的老师。所以,第一部分相当简单=以下数据类:

data class TimeSlotWithSubjects (

    @Embedded val timeSlot: TimeSlot,
    @Relation(
        parentColumn = "subjectId",
        entityColumn = "subject_id"
    )
    val subjects: List<Subject>
)

但是我们这里没有关于老师的信息。同时我还有另一个数据类:

data class SubjectWithTeacher (

    @Embedded val subject: Subject,
    @Relation(
        parentColumn = "teacher_id",
        entityColumn = "teacherId"
    )
    val teachers: List<Teacher>
)

但是这里我没有关于时间段的信息。请提出一种方法,如何获取包含所有需要信息的 LiveData 列表?

【问题讨论】:

    标签: kotlin android-recyclerview android-livedata data-class


    【解决方案1】:

    由于没有好的建议,我通过以下方式解决了任务:

    1. 在 ViewModel 中:
    val teachers_list = db.getAllTeachers()
    
    1. 在适配器中:
    class ViewHolder private constructor (val binding: ListItemTimeSlotWithSubjectAndWeekdayBinding) : RecyclerView.ViewHolder(binding.root){
    
            companion object {
    
                lateinit var t_list: List<Teacher>
    
                fun getTeacherFromList(teacher_id:Long):Teacher?{
    
                    for (teacher in t_list){
                        if (teacher.teacherId == teacher_id)
                            return teacher
                    }
                    return null
                }
    
                fun setTeachersList(list: List<Teacher>){
                    t_list = list
                }
            }
    
           fun bind(item: TimeSlotWithSubjects, clickListener: LessonsScheduleListener) {
    
                //
    
                if (!item.subjects.isEmpty()){
                    binding.subjectName.text = item.subjects[0].name
                    //
    
                    if (item.subjects[0].teacherId > 0){
    
                        val l_teacher = getTeacherFromList(item.subjects[0].teacherId)
                       //
    
                    }
    
            }
    
    1. 在片段中:
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
    //
            binding.lessonsScheduleViewModel = viewModel
    //
            viewModel.teachers_list.observe(viewLifecycleOwner, Observer {
                it?.let {
                    LessonsScheduleAdapter.ViewHolder.setTeachersList(it)
                }
            })
    //
        }
    

    我想有更好的方法 - 请提出建议。至少这个可行+不违反基本架构原则)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多