Android: 使用 Realm 进行嵌套查询?

Android: using Realm to make a nested query?

我有一个教师列表,每个教师列表都包含一个学生对象列表。每个学生都有一份他每天必须带的教科书清单。它看起来像这样:

Teacher { 
String teacherName;
RealmList<Student> students = new RealmList<>(); 
}

Student { 
String studentName;
RealmList<SchoolDay> schooldays = new RealmList<>(); 
}

SchoolDay { 
String day;
RealmList<RealmString> schoolbooks; 
}

(RealmString 只是原始的 String 包装为 RealmObject

我想提取某个学生在某一天的教科书列表 - 几个学生可能有相同的教科书,但我只对某个学生在某一天的教科书感兴趣(例如, 星期日)。一个学生可能在几位老师的 类 中,但我只对其中一位老师的结果感兴趣,因为每个老师的每周书单都不一样。示例查询数据可能是:

teacher : steven

student : austin

day     : sunday

这是我卡住的地方 - 我该如何子查询它?获得我感兴趣的老师:

RealmResults<Teacher> = realm.where(Teacher.class).equalTo("teacherName",  "steven").findAll();

但是,然后我必须 运行 对教师的子查询和对学生的子查询 - 或者更好的是,运行 所有这些都在同一个查询中。作为我的最终结果,我想要得到的只是代表那个特定学生的教科书的字符串。我该怎么做?

你能试试吗:

realm.where(Teacher.class)
.equalTo("teacherName",teachername)
.equalTo("students.studentName",studentname)
.equalTo("students.schooldays.day",day).findAll();

毕竟你有 Teacher 对象,你可以在一个查询中获取变量:

RealmResults<Teacher> teachers= your query above;
    for(Teacher teacher:teachers){
       //remember still you can have multiple students for given teacher
       for(Student student:teacher.getStudents()){
           for(Schoolday schoolday:student.getSchooldays()){
             schoolday.schoolbooks bla bla bla...
           }
       }
    }

为什么我们使用 for 循环:因为 findAll() 方法可以 return 多个结果,如果你想要单个 Teacher 对象使用 findFirst()

这将 return 你给定 teachername 的老师属性 contains/includes 给定学生姓名的学生:studentname 并且这些学生有上课日给定: 姓名。

我觉得最后的解释有点难懂,现在我举例说明一下:

  1. 在第一个查询中,您将获得名称为 "Yasin" 的教师。 假设在这个查询之后你有 5 名教师,名字为 "Yasin".
  2. 那么在第二个查询中,您正在搜索这5位Yasin老师;如果他们其中一位学生的名字是 "Jon"。假设您在该查询后有 3 位 Yasin 老师。
  3. 然后在最后一个查询中搜索那 3 "Yasin" 位老师;如果他们的一个学生上学日是 "Sunday".

你可以看看这个问题:

这个问题也很好参考;这对我很有帮助:realm-android-nested-query

我会提出一个更简单的选择。

你可以利用inverse relationships:

模型看起来像:

Teacher { 
    String teacherName;
    RealmList<Student> students = new RealmList<>(); 
}

Student { 
    String studentName;
    RealmList<SchoolDay> schooldays = new RealmList<>(); 

    @LinkingObjects("students")
    final RealmResults<Teacher> teacher = null;
}

SchoolDay { 
    String day;
    RealmList<SchoolBook> schoolbooks; 

    @LinkingObjects("schooldays")
    final RealmResults<Student> student = null;
}

SchoolBook { 
    String bookName;

    @LinkingObjects("schoolbooks")
    final RealmResults<SchoolDay> day = null;
}

并且查询将非常简单:

RealmResults<SchoolBook> = realm
    .where(SchoolBook.class)
    .equalTo("day.student.studentName", "austin")
    .findAll();