2016-08-21 93 views
1

我有一個教師列表,每個都包含一個Student對象列表。每個學生都包含他必須每天帶來的教科書清單。它看起來像這樣:Android:使用Realm製作嵌套查詢?

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

你可以嘗試這樣的:

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

畢竟你有教師目標(S),你可以在一個查詢得到的變量:

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

這將返回給你教師給定教師名稱屬性包含/包含給定學生姓名的學生:studentname和那些學生有給定的學生:名稱。

我認爲最後的解釋是頗有幾分很難理解,現在我舉例解釋:

  1. 在第一個查詢你正在教師中具有NAME =「亞辛」。 假設在這個查詢之後,你得到了名爲「Yasin」的5名教師。
  2. 然後在第二個查詢中,您正在搜索這5位亞辛教師;如果他們的學生姓名是「喬恩」。假設在查詢之後你有3位亞辛老師。
  3. 然後在最後一個查詢中搜索那3個「亞辛」老師;如果他們的一個學生上學日是「星期天」。

你可以看看這個問題:how-to-make-a-nested-query-in-realm

而且這個問題是很好的參考;這對我很有幫助:realm-android-nested-query

+0

謝謝,但是這種方法只返回老師的對象,我想要找回包含教科書的字符串。有沒有辦法直接從Realm中選擇教科書字符串? – Jon

+0

@Jon當你找到老師時,你可以在一個查詢中獲得他的課本。如果你不知道該怎麼做,我可以編輯我的答案。我是這樣說的,因爲'findAll()'方法可以返回給定名稱的多個教師,並且您可以使用for循環 –

+0

您的意思是在另一個領域查詢中嗎?是的,我會很感激 - 非常感謝。 – Jon

2

我會提出一個更簡單的選項。

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