Запросы ссылки на область с соединением

Почти тот же вопрос, что и Realm, сложный связанный запрос, но с важным вариантом:

В официальных документах https://realm.io/docs/java/latest/ - есть пример, как выбрать владельцев "коричневых" собак и владельцев "пушистых" собак. Не, как написано в предыдущем вопросе, "коричневые пушистые" собаки, потому что примеры кода не реализуют соединение.

Итак, мой вопрос: как получить только лиц, которые владеют "коричневой" и "пушистой" собакой (оба условия на одной и той же собаке)? Это только 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();

Мне нужно проверить соединение условий над подэлементами в массиве. Мне нужно реализовать это как запрос, чтобы заполнить адаптер. Это возможно с Царством?

Я мечтал о новом типе группировки для условий, которые позволяют указать несколько условий для элементов поля списка, например:

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();

2 ответа

Вы можете определить обратную связь и запросить собаку по имени и цвету. Затем вы можете перебрать собак и получить владельцев.

Используйте запрос на 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();
Другие вопросы по тегам