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
- No public RealmResults <E> Constructor?
- ¿Cómo se comprueba si ya se ha cerrado una instancia de reino?
- Generar error con Realm
- Error irrecuperable. Mremap (): Falló: Fuera de memoria en la línea 188 io_realm_internal_SharedGroup.cpp
- Actualización / cambio de la clave de cifrado de Realm
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í.
- Clase de datos Kotlin de RealmObject
- Cómo crear un nuevo RealmObject que contiene una RealmList
- 'RealmNoticeModelClass' tiene una clave primaria, use 'createObject (Class <E>, Object)' en su lugar
- Cerrar instancia de Realm después de la ejecución
- ¿Cómo comprobar el reino para la existencia de los datos del androide?
- ¿RealmBaseAdapter se ha eliminado de realm-java?
- List <Object> O RealmList <RealmObject> en Realm Android
- Realm.getInstance (context) no funciona más después de la migración
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.