美文网首页
realm连接查询

realm连接查询

作者: Pino | 来源:发表于2019-04-23 09:00 被阅读0次
    可以查询链接或关系。考虑下面的模型:
      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>
    

    相关文章

      网友评论

          本文标题:realm连接查询

          本文链接:https://www.haomeiwen.com/subject/kcdmgqtx.html