我如何查询这样的结构:
public class Animal extends RealmObject {
RealmList<Bird> birds;
}
public class Bird extends RealmObject {
int type;
RealmList<RealmInteger> species;
}
RealmInteger是一个int value
我想查找Animal
个Bird
个对象,其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(它是空的),所以它不应该返回它。它确实如此。
答案 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();
只有多个链接查询才需要这个技巧。