gpt4 book ai didi

android - 同时查询两个条件的 Realm

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:56 25 4
gpt4 key购买 nike

我将如何查询这样的结构:

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


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

RealmInteger 是一个具有int 值

的对象

我想找到所有具有 BirdAnimal 对象,该对象具有 value 3 的种类和那个 Bird 属于类型 2

我试过了,但它总是忽略类型:

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

我的猜测是它找到了与 value 的匹配,但没有同时检查 type 字段。我需要一种方法来执行 .equalTo("birds.species.value", 3) 以仅检查 type 2 的鸟类?

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

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

因为这个 Animal 没有 type 2 的物种 value 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);
}

关于android - 同时查询两个条件的 Realm ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com