База данных номеров. Как получить LiveData из вложенного запроса? - PullRequest
0 голосов
/ 23 января 2020

У меня достаточно простая модель данных 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 со всей необходимой информацией?

1 Ответ

0 голосов
/ 25 января 2020

Поскольку хороших предложений не было, я решил задачу следующим образом:

  1. В ViewModel:
val teachers_list = db.getAllTeachers()
В адаптере:
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)
                   //

                }

        }
Во фрагменте:
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)
            }
        })
//
    }

Я думаю, есть более подходящие подходы - пожалуйста, предложите. По крайней мере, это работает + не нарушает базовые архитектурные принципы)

...