0

与Realm几乎相同的问题,复杂的链接查询,但有一个重要的变体:

在官方文档中,https://realm.io/docs/java/latest/#link-queries - 有一个示例如何选择“棕色”狗的主人和“蓬松”狗的主人。不像之前的问题中写的那样,“Brown Fluffy”狗,因为代码示例没有实现连词。

所以我的问题是:如何只获得拥有“棕色”和“蓬松”狗的人(同一只狗的两种条件)?给定示例的数据,这只是 U2。文档中的第二个代码示例添加了第三个过滤器“黄色”,所以答案似乎是正确的,但在同一条狗的字段上仍然没有连词。以下是我在文档中的尝试:

// returns both U1 and U2, because U1 owns a Brown dog, and U2 a Fluffy
RealmResults<Person> r1 = realm.where(Person.class)
            .equalTo("dogs.name", "Fluffy")
            .equalTo("dogs.color", "Brown")
            .findAll();
// returns both U1 and U2, because U1 has a Fluffy but it is red, and has also a brown dog (Fido)
RealmResults<Person> r2 = realm.where(Person.class)
            .equalTo("dogs.name", "Fluffy")
            .findAll()
            .where()
            .equalTo("dogs.color", "Brown")
            .findAll();

我需要检查数组中子元素的条件结合。我需要将其实现为查询,以填充适配器。Realm可以吗?

我梦想着一种新的条件分组,允许在 List 字段的项目上指定几个条件,如下所示:

RealmResults<Person> r3 = realm.where(Person.class)
    .beginFilterAny("dogs") // keep only Persons whose at least one dog satisfy:
        .equalTo("name", "Fluffy")
        .equalTo("color", "Brown")
    .endFilterAny()
    .findAll();
4

2 回答 2

0

在这些条件下使用查询Dog.class,因此您将拥有所有Brown and Fluffy狗。迭代结果以提取所有狗的主键,并在查询中使用它Person.class来检索至少拥有其中一只狗的所有人。

//get all brown and fluffy dogs
RealmResults<Dog> dogs = realm.where(Dog.class)
     .equalTo("name", "Fluffy")
     .equalTo("color", "Brown")
     .findAll();

//extract dogs id
Set<UUID> dogIds = dogs.stream()
    .map(d -> d.getId().toString())
    .collect(Collectors.toSet());

//find all brown and fluffy dogs owners
RealmResults<Person> persons = realm.where(Person.class)
     .in("dogs.id", dogIds.toArray(new String[dogIds.size()]))
     .findAll();
于 2019-01-08T12:20:12.560 回答
0

您可以定义反向关系并按名称和颜色查询狗。然后,您可以遍历狗并获取所有者。

于 2018-12-14T21:24:24.447 回答