запросы ссылки на область с соединением - PullRequest
0 голосов
/ 12 декабря 2018

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

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

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

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

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 ]

0 голосов
/ 08 января 2019

Используйте запрос на 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();
0 голосов
/ 15 декабря 2018

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

...