Как реализовать связь «многие ко многим» с дополнительными данными в ассоциации, используя Room for Android? - PullRequest
0 голосов
/ 01 декабря 2018

Я нашел примеры реализации многих-многих отношений для Android с помощью Room.Однако все они просты, включая таблицу ассоциации, имеющую только идентификаторы для связанных объектов, поэтому когда-либо возвращается только список объектов любого объекта.Если есть какие-то данные с ассоциацией, как я могу обслужить это?

Например, для ассоциации субъекта и студента, если я хочу, чтобы в ассоциации была запись «результат», чтобы у каждого учащегося был 1 результат по предмету, как это делается?Объектами будут «Subject», «Student», «Result», где таблица результатов обеспечивает связь.Для получения всех результатов учащихся по одному предмету необходим только один запрос на присоединение, но что это такое и какой тип должен быть возвращен методом 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<List<Subject>> getAllSubjects ();
}

@Dao
public interface StudentDAO
{
    @Query("SELECT * FROM students")
    LiveData<List<Student>> getAllStudents ();
}

@Dao
public interface ResultDAO
{
    @Query("SELECT * FROM students INNER JOIN results ON students.studentId=results.studentId WHERE results.subjectId=:subjectId")
    LiveData<List<Student>> getStudentsForSubject (int subjectId);

    @Query("SELECT * FROM subjects INNER JOIN results ON subjects.subjectId=results.subjectId WHERE results.studentId=:studentId")
    LiveData<List<Subject>> 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<List<something>> getStudentResultsForSubject (int subjectId)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...