1

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

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

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

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

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

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

teacher : steven

student : austin

day     : sunday

这就是我卡住的地方 - 我如何子查询这个?找到我感兴趣的老师:

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

但是,然后我必须对教师运行一个子查询,对学生运行一个子查询——或者更好的是,以某种方式在同一个查询中运行所有这些查询。作为我的最终结果,我想要得到的只是代表那个特定学生的教科书的字符串。我怎样才能做到这一点?

4

2 回答 2

4

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

您可以利用反向关系:

模型将如下所示:

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();
于 2017-08-06T09:04:20.810 回答
2

你能这样试试吗:

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()方法可以返回多个结果,如果你想使用单个 Teacher 对象findFirst()

这将返回给定teachername属性的教师,该属性包含/包括具有给定学生姓名的学生:studentname并且这些学生的上课日具有给定的:日期名称。

我觉得最后一个解释有点难理解,现在我用例子来解释:

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

你可以看看这个问题:how-to-make-a-nested-query-in-realm

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

于 2016-08-21T11:06:49.157 回答