запросы на связь области с конъюнкцией

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

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

Итак, мой вопрос: как получить только тех, у кого есть «коричневая» и «пушистая» собака (оба условия для одной и той же собаки)? Это только U2, учитывая данные примера. Второй пример кода из документации добавляет третий фильтр «Желтый», так что ответ кажется правильным, но конъюнкции на полях того же Dog по-прежнему нет. Ниже приведены мои попытки из документов:

// 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?

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

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

person Pierre N.    schedule 12.12.2018    source источник


Ответы (2)


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

person geisshirt    schedule 14.12.2018
comment
Дело не в том, чтобы получить владельцев, а в том, чтобы автоматически создать управляемую коллекцию для RealmRecyclerViewAdapter. Если я создам RealmList‹Person› с помощью итерации собак, он не будет управляться. Но я могу использовать ссылку для фильтрации результатов. - person Pierre N.; 16.12.2018

Используйте запрос на 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();
person Maelig    schedule 08.01.2019