【问题标题】:Android Room Student + School (One-to-Many relation) get school nameAndroid Room Student + School(一对多关系)获取学校名称
【发布时间】:2020-06-13 21:11:51
【问题描述】:

我是 Room 的新手,我正在玩一个示例应用程序,该应用程序可以注册学生并将其显示在 RecyclerView 中。

我有一个学生类,例如:

@Entity
public class Student {
    @PrimaryKey (autoGenerate = true)
    private int id;
    private String studentNumber;
    private String name;
    private int schoolId;
}

一个学校班级:

@Entity
public class School {
    @PrimaryKey (autoGenerate = true)
    private int id;
    private String name;
}

具有一对多关系(一所学校有一个学生列表,一个学生属于一所学校)

public class SchoolWithStudents {
    @Embedded private School school;
    @Relation(
         parentColumn = "id",
         entityColumn = "schoolId"
    )
    private List<Student> studentList;
}

如果我有一个要显示学生详细信息(包括学校名称)的活动。对我来说似乎很奇怪,只需要查询数据库才能获得类似于 getSchoolById 的学校名称。

我来自 Spring Boot,在 Student 类中嵌入一个 School 对象并仍然管理关系是完全正常的。

因此,获取学校名称就像:student.getSchool.getName() 一样简单。 我没看错吧?我真的需要额外的查询吗?我还没有使用 SchoolWithStudents,只是为了建筑目的而声明

【问题讨论】:

    标签: android relationship android-room


    【解决方案1】:

    我不得不查询数据库只是为了获得类似于 getSchoolById 的学校名称,这对我来说似乎很奇怪

    你不必那样做。在任何情况下,只需调用 Room 即可获取所需的所有数据。

    如果您拨打下一个电话:

    @Query("SELECT * from school")
    List<SchoolWithStudents> loadSchoolWithStudents();
    
    

    您将获得带有嵌入 School 对象的列表,因此无需额外查询 - 您的响应中有学校名称及其所有属性(不在 Student 对象内,但无论如何您都可以获得它很容易从School对象和school.getName())。

    如果您想获得其他结构的列表 - StudentWithSchool(学生和学校都将“在同一级别”),您可以这样做:

    public class StudentWithSchool {
        @Embedded private Student student;
        @Relation(
             parentColumn = "schoolId",
             entityColumn = "id"
        )
        private School school;
    }
    
    

    及查询方法:

    @Query("SELECT * from student")
    List<StudentWithSchool> loadStudentWithSchool();
    

    【讨论】:

    • 我认为实现 StudentWithSchool 可能会成功。我从来没有想过要把它翻过来,因为我在网上找不到很多房间的例子。只有一个简单的实体演示项目。学生是应用程序中的主要实体。主要的回收视图是学生表中所有学生的列表,当您单击某个项目时,您会转到详细信息屏幕,您可以在其中查看学生信息以及他们所属的学校。
    • 我可以补充一点,如果您熟悉 Sql,您可以在不使用 @Relation 的情况下获得相同的结果 - 只是为您的查询增加一些复杂性(在第二个表的查询“左连接”中使用)。
    • 问题是我试图学习使用 Room 、关系等执行此操作的正确方法。这似乎是一个非常常见的用例,并且使用更复杂的 SQL 似乎超出了 Room 方式.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多