2015-09-23 6 views
5

assuma la situazione successiva:Realm java condizioni di query

//I don't put the getters and setters, but assume they are there 
public class User extends RealmObject { 
    private RealmList<Dog> dogs; 
} 

public class Dog extends RealmObject { 
    //UPDATE: I've added the variable city, to make my question more exact 
    private String city; 
    private String color; 
    private String name; 
} 

Si supponga: Persona 1 ha cani: NY-bianco-Joe Persona 2 ha cani: NY-marrone-Mary, SF-bianco-Fluffy, LA-brown-Fluffy Persona 3 ha cani: NY-brown-Fluffy, LA-white-Pepito

Domanda: Come posso interrogare tutte le persone che hanno un cane marrone chiamato Fluffy?

Quello che ho provato con l'implicito E:

RealmQuery<User> userQuery = realm.where(User.class).equalTo("dogs.color", "brown").equalTo("dogs.name", "Fluffy"); 

Poi ho letto la documentazione e le due equalTo() condizioni sono valutati separatamente, il che significa che avrò:

Tutto il utenti che hanno un cane marrone e un cane che si chiama Fluffy. (Quindi i risultati sono P2, P3).

Come devo scrivere questa domanda per applicare le condizioni allo stesso cane?

risposta

1

Mi sembra che l'approccio migliore sia utilizzare la query per chiave primaria. Voglio dire prima di aggiungere la chiave primaria per Dog classe:

class Dog extends RealmObject { 
     @PrimaryKey 
     private int id; 
     private String color; 
     private String name; 
} 

Poi primo passo per trovare gli utenti che hanno un cane marrone chiamato Fluffy, è quello di trovare la chiave primaria di un cane. Così abbiamo fare una query per trovare esatta Dog:

Dog dog = realm.where(Dog.class).equalTo("color", "brown").equalTo("name", "Fluffy").findFirst(); 

Dopo di che stiamo cercando per gli utenti che hanno un cane con chiave primaria definita (campo ID):

RealmResults<User> users = realm.where(User.class).equalTo("dogs.id", dog.getId()).findAll(); 
+0

Grazie per la risposta, hai sottolineato che la mia domanda non era esatta, aggiornerò il mio post, per favore controlla di nuovo. Grazie ancora, e scusa. – user1915767

1

Le query di collegamento a Realm sono quantificatori esistenziali (https://en.wikipedia.org/wiki/Existential_quantification). Ciò implica che se una condizione è soddisfatta per un solo oggetto nella classe figlio, l'oggetto nella classe genitore viene aggiunto allo RealmResults.

Link query example mostra come funzioneranno i quantificatori esistenziali. Al momento, sarà necessario iterare User se interrogare l'elenco Dogs singolarmente.

C'è uno issue aperto su ricerche inverse.

+0

Grazie Kenneth! – user1915767