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
并且这些学生有上课日给定:天 姓名。
我觉得最后的解释有点难懂,现在我举例说明一下:
- 在第一个查询中,您将获得名称为 "Yasin" 的教师。
假设在这个查询之后你有 5 名教师,名字为 "Yasin".
- 那么在第二个查询中,您正在搜索这5位Yasin老师;如果他们其中一位学生的名字是 "Jon"。假设您在该查询后有 3 位 Yasin 老师。
- 然后在最后一个查询中搜索那 3 "Yasin" 位老师;如果他们的一个学生上学日是 "Sunday".
你可以看看这个问题:
这个问题也很好参考;这对我很有帮助:realm-android-nested-query
我会提出一个更简单的选择。
模型看起来像:
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();
我有一个教师列表,每个教师列表都包含一个学生对象列表。每个学生都有一份他每天必须带的教科书清单。它看起来像这样:
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
并且这些学生有上课日给定:天 姓名。
我觉得最后的解释有点难懂,现在我举例说明一下:
- 在第一个查询中,您将获得名称为 "Yasin" 的教师。 假设在这个查询之后你有 5 名教师,名字为 "Yasin".
- 那么在第二个查询中,您正在搜索这5位Yasin老师;如果他们其中一位学生的名字是 "Jon"。假设您在该查询后有 3 位 Yasin 老师。
- 然后在最后一个查询中搜索那 3 "Yasin" 位老师;如果他们的一个学生上学日是 "Sunday".
你可以看看这个问题:
这个问题也很好参考;这对我很有帮助:realm-android-nested-query
我会提出一个更简单的选择。
模型看起来像:
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();