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

时间:2016-08-21 10:45:54

标签: android sql realm realm-migration realm-list

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

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();

然而,我必须在教师和学生的子查询上运行子查询 - 或者更好的是,以某种方式在同一查询中运行所有这些子查询。我想得到的是我的最终结果只是表示该特定学生的教科书的字符串。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

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

您可以使用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();

答案 1 :(得分:2)

你能尝试那样:

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

毕竟你有教师对象,你可以在一个查询中获得变量:

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()方法可以返回多个结果,如果您希望单个教师对象使用findFirst()

这将返回给定的 teachername 属性的教师,其中包含/包含具有给定学生姓名的学生:studentname,并且这些学生的学习时间为:名。

我认为最后的解释有点难以理解,现在我用例子来解释:

  1. 在第一个查询中,您将获得名为=&#34; Yasin&#34;的教师。     假设在此查询之后,您有5名教师姓名&#34; Yasin&#34;。
  2. 然后在第二个查询中,您正在搜索这5位Yasin老师;如果他们的学生姓名是&#34; Jon&#34;。假设在该查询之后你有3名Yasin老师。
  3. 然后在最后一个查询中,您搜索了3&#34; Yasin&#34;老师;如果他们的学生上学日是&#34;星期天&#34;。
  4. 您可以查看以下问题:how-to-make-a-nested-query-in-realm

    此问题也适用于引用;这对我很有帮助:realm-android-nested-query