我找到了使用Room为Android实现多对多关系的示例 . 然而,它们都很简单,涉及仅具有关联实体的标识符的关联表,因此仅返回任一实体的对象列表 . 如果有关联的数据,我该如何迎合它?
例如,对于主题和学生协会,如果我想在关联中有一个“结果”条目,以便每个学生对一个主题有1个结果,那怎么办?实体将是“主题”,“学生”,“结果”,其中结果表提供关联 . 只需要1个连接查询就可以获得单个主题的所有学生成绩,但它是什么,以及DAO方法应该为它返回什么类型?请参阅下面代码的结尾 . 否则,会出现Room需要2个查询 .
@Entity(tableName="students")
public class Student
{
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "studentId")
private int studentId;
@ColumnInfo(name = "studentName")
private String studentName;
}
@Entity(tableName="subjects")
public class Subject
{
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "subjectId")
private int id;
@ColumnInfo(name = "title")
private String title;
}
@Entity(tableName = "results",
primaryKeys = { "subjectId", "studentId" },
foreignKeys = {
@ForeignKey(entity = Subject.class, parentColumns = "subjectId",
childColumns = "subjectId", onDelete = ForeignKey.CASCADE),
@ForeignKey(entity = Student.class, parentColumns = "studentId",
childColumns = "studentId", onDelete = ForeignKey.CASCADE)}
)
public class Result
{
int subjectId;
int studentId;
@ColumnInfo(name = "result")
int result;
}
@Dao
public interface SubjectDAO
{
@Query("SELECT * FROM subjects")
LiveData> getAllSubjects ();
}
@Dao
public interface StudentDAO
{
@Query("SELECT * FROM students")
LiveData> getAllStudents ();
}
@Dao
public interface ResultDAO
{
@Query("SELECT * FROM students INNER JOIN results ON students.studentId=results.studentId WHERE results.subjectId=:subjectId")
LiveData> getStudentsForSubject (int subjectId);
@Query("SELECT * FROM subjects INNER JOIN results ON subjects.subjectId=results.subjectId WHERE results.studentId=:studentId")
LiveData> getSubjectsForStudent (int studentId);
/* Only 1 query should be needed, and what is the something returned?
Don't want it to just be "Result"
because that means another query would be used with the same association in order to get the Student data. */
@Query("SELECT ????????????????")
LiveData> getStudentResultsForSubject (int subjectId)
}