realm连接查询

2019-04-23  本文已影响0人  Pino
可以查询链接或关系。考虑下面的模型:
  public class Person extends RealmObject {
  private String id;
  private String name;
  private RealmList<Dog> dogs;
  // getters and setters
}

public class Dog extends RealmObject {
  private String id;
  private String name;
  private String color;
  // getters and setters
}`</pre>

每个`Person`对象都有多个狗关系,如下表所示:
现在,我们可以找到具有链接查询的特定人员:
RealmResults<Person> persons = realm.where(Person.class)
                                .equalTo("dogs.color", "Brown")
                                .findAll();`</pre>

字段名称`equalTo`是*通过关系*的*路径,*使用句点(`.`)作为分隔符。上面的查询显示“查找所有拥有颜色为棕色的狗的人。”请注意,结果将包含至少有一个匹配的对象的*所有* `Dog`对象:`Person``Dog`
persons.get(0).getDogs(); // => [A,B]
persons.get(1).getDogs(); // => [B,C,D]`</pre>

请记住,我们正在寻找拥有特定种类狗的人,而不是真正的狗。

让我们深入挖掘一下:
RealmResults<Person> r1 = realm.where(Person.class)
                             .equalTo("dogs.name", "Fluffy")
                             .equalTo("dogs.color", "Brown")
                             .findAll();

// r2 => [U2]
RealmResults<Person> r2 = realm.where(Person.class)
                             .equalTo("dogs.name", "Fluffy")
                             .findAll()
                             .where()
                             .equalTo("dogs.color", "Brown")
                             .findAll()
                             .where()
                             .equalTo("dogs.color", "Yellow")
                             .findAll();`</pre>

第一个问题是:“找到所有有狗名为'蓬松' *并且*有颜色为'布朗'的狗的人。”第二个问题是:“找到所有有狗名为'蓬松'的人。” 在该结果集中,找到所有拥有颜色为“棕色”的狗的人。然后,在该结果集中,找到所有拥有颜色为“黄色”的狗的人。“因此,第一个查询找到两组人员并返回这些集合的交集; 第二个查询以不同的方式运行,通过获取每个查询的结果集`findAll`并将其提供给下一个`where`查询来连续缩小结果范围。您可以通过链接重写第二个查询:
RealmResults<Person> set1 = realm.where(Person.class).equalTo("dogs.name", "Fluffy").findAll();
RealmResults<Person> set2 = set1.where(Person.class).equalTo("dogs.color", "Brown").findAll();
RealmResults<Person> set3 = set2.where(Person.class).equalTo("dogs.color", "Yellow").findAll();`</pre>

使用反向关系,您可以扩展查询的可能性。让我们考虑相同的两个模型类,`Person`和`Dog`。`Person`您可以先查询狗,而不是使用反向关系,而不是启动查询。

 RealmResults<Dog> brownFluffies = realm.where(Dog.class).equalTo("color", "Brown").equalTo("name", "Fluffy").findAll();
for (Dog brownFluffy : brownFluffies) {
    RealmResults<Person> owners = brownFluffy.getOwners();
    // ...
}`</pre>

您还可以使用具有反向关系的链接查询:
 RealmResults<Dog> dogs = realm.where(Dog.class).equalTo("persons.name", "Jane").findAll();`</pre>
上一篇下一篇

猜你喜欢

热点阅读