领域同时查询两个条件

时间:2017-08-06 07:15:40

标签: android realm

我如何查询这样的结构:

public class Animal extends RealmObject { 
    RealmList<Bird> birds;
}


public class Bird extends RealmObject { 
    int type;
    RealmList<RealmInteger> species;
}

RealmInteger是一个int value

的对象

我想查找AnimalBird个对象,其value 3种类Bird type 2

我试过了,但它一直忽略type

realm.where(Animal.class)
    .equalTo("birds.type", 2)
    .equalTo("birds.species.value", 3)
    .findAll();

我的猜测是它找到了与值匹配但不同时检查类型字段。我需要一种方法.equalTo("birds.species.value", 3)只检查type 2的鸟类?

更新: 尝试下面的@EpicPandaForce答案,它也返回这个动物的数据:

"birds": [
     {
        "species": [3, 15, 26],
        "type": 1
     },
     {
        "species": [],
        "type": 2,
     }
]

因为此Animal没有value 2的物种type 3(它是空的),所以它不应该返回它。它确实如此。

2 个答案:

答案 0 :(得分:3)

不幸的是,你遇到了链接查询如何工作的特点,而且目前没有简单的方法可以做你想做的事。

根本原因是您从Animal的角度进行查询,并且您有RealmList两个等级。你所追求的是一种Realm尚未支持的子查询。链接查询的工作原理详见:https://realm.io/docs/java/latest/#link-queries。我强烈建议您完成这些文档中的示例。

尽管如此,它仍然可以达到你想要的效果,但你需要我们新添加的@LinkingObjects注释的组合+一些手动工作来完成它。方法如下:

// Animal class must have a stable hashcode. I did it by adding a primary key
// here, but it can be done in multiple ways.
public class Animal extends RealmObject {
    @PrimaryKey
    public String id = UUID.randomUUID().toString();
    public RealmList<Bird> birds;

    @Override
    public boolean equals(Object o) {
        // Make sure you have a stable equals/hashcode
        // See https://realm.io/docs/java/latest/#realmobjects-hashcode
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return id.equals(animal.id);
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }
}

// Add a @LinkingObjects field to Bird
// See https://realm.io/docs/java/latest/#inverse-relationships
public class Bird extends RealmObject {
    public int type;
    public RealmList<RealmInteger> species;
    @LinkingObjects("birds")
    public final RealmResults<Animal> animalGroup = null;

    @Override
    public String toString() {
        return "Bird{" +
                "type=" + type +
                '}';
    }
}

// Query the birds instead of Animal
RealmResults<Bird> birds = realm.where(Bird.class)
        .equalTo("type", 2)
        .equalTo("species.value", 3)
        .findAll();

// You must collect all Animals manually
// See https://github.com/realm/realm-java/issues/2232
Set<Animal> animals = new HashSet<>();
for (Bird bird : birds) {
    animals.addAll(bird.animalGroup);
}

答案 1 :(得分:1)

realm.where(Animal.class)
  .equalTo("birds.type", 2)
  .findAll()
  .where()
  .equalTo("birds.species.value", 3)
  .findAll();

只有多个链接查询才需要这个技巧。