Запросы ссылки на область с соединением
Почти тот же вопрос, что и 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();