Requisito de dominio con dos condiciones al mismo tiempo

¿Cómo podría consultar una estructura como esta:

public class Animal extends RealmObject { RealmList<Bird> birds; } public class Bird extends RealmObject { int type; RealmList<RealmInteger> species; } 

RealmInteger es un objeto con un int value

Quiero encontrar todos los objetos Animal que tienen Bird que tiene una especie de value 3 y que el Bird es del type 2

He intentado esto, pero sigue ignorando el type :

 realm.where(Animal.class) .equalTo("birds.type", 2) .equalTo("birds.species.value", 3) .findAll(); 

Mi conjetura es que encuentra un fósforo con valor pero no comprueba el campo del tipo al mismo tiempo. Necesito una manera de hacer .equalTo("birds.species.value", 3) para comprobar sólo aves de type 2?

Actualización : Probado la respuesta @EpicPandaForce abajo, también está devolviendo este Animal con los datos:

 "birds": [ { "species": [3, 15, 26], "type": 1 }, { "species": [], "type": 2, } ] 

Debido a que este Animal no tiene un value de especie de 3 (está vacío) de type 2, NO debe devolverlo. Sin embargo, sí.

Por desgracia, se está ejecutando en una peculiaridad de cómo funcionan las consultas de enlace, y actualmente, no hay manera fácil de hacer lo que desea.

La razón subyacente es que usted está preguntando desde el punto de vista de Animal y que tiene dos niveles de RealmList . Lo que buscas es una especie de subconsulta que aún no es compatible con Realm. Los detalles de cómo funcionan las consultas de enlaces se describen aquí: https://realm.io/docs/java/latest/#link-queries . Recomiendo encarecidamente trabajar con el ejemplo en esos documentos.

Dicho esto, todavía es posible lograr lo que quieres, pero necesitas una combinación de nuestra nueva anotación @LinkingObjects añadida y algunos manualmente funcionan para hacerlo. Aquí es cómo:

 // Animal class must have a stable hashcode. I did it by adding a primary key // here, but it can be done in multiple ways. public class Animal extends RealmObject { @PrimaryKey public String id = UUID.randomUUID().toString(); public RealmList<Bird> birds; @Override public boolean equals(Object o) { // Make sure you have a stable equals/hashcode // See https://realm.io/docs/java/latest/#realmobjects-hashcode if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Animal animal = (Animal) o; return id.equals(animal.id); } @Override public int hashCode() { return id.hashCode(); } } // Add a @LinkingObjects field to Bird // See https://realm.io/docs/java/latest/#inverse-relationships public class Bird extends RealmObject { public int type; public RealmList<RealmInteger> species; @LinkingObjects("birds") public final RealmResults<Animal> animalGroup = null; @Override public String toString() { return "Bird{" + "type=" + type + '}'; } } // Query the birds instead of Animal RealmResults<Bird> birds = realm.where(Bird.class) .equalTo("type", 2) .equalTo("species.value", 3) .findAll(); // You must collect all Animals manually // See https://github.com/realm/realm-java/issues/2232 Set<Animal> animals = new HashSet<>(); for (Bird bird : birds) { animals.addAll(bird.animalGroup); } 
 realm.where(Animal.class) .equalTo("birds.type", 2) .findAll() .where() .equalTo("birds.species.value", 3) .findAll(); 

Este truco sólo es necesario para las consultas de enlaces múltiples.

  • Declaración de actualización en Realm android
  • Realm java sort con varios campos
  • Cómo convertir RealmResults objeto a RealmList?
  • Realm Exception 'value' no es un objeto gestionado válido
  • Cómo hacer una copia de seguridad de Realm DB en Android antes de eliminar el archivo Realm. ¿Hay alguna manera de restaurar el archivo de copia de seguridad?
  • Realm.io Android mejor enfoque para obtener los últimos 20 elementos de una tabla
  • Realm con datos pre-poblados en activos?
  • Cómo configurar el incremento automático de clave principal en el reino de Android
  • Android Realm copyToRealmOrUpdate actualiza los campos existentes
  • Realm y Comportamiento de incremento automático (Android)
  • Android: Realm.getInstance (context) devuelve una instancia de dominio ya cerrada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.