2015-04-22 9 views
6

Ho un set di tipi diversi di oggetti persistenti nel Realm Database. Ora voglio interrogare certi tipi di oggetti compresi tutti i campi di quell'oggetto. Il metodo che ho scritto qui sotto è quello di ottenere tutti i campi dichiarati dell'oggetto e iterare sui campi per verificare se la stringa di query fornita è contenuta.Query In Realm Database: Trova tutti gli oggetti contenenti stringa di query

Funziona correttamente per i tipi di campi stringa ma genera java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER. per valori interi poiché il mio oggetto query di ricerca è stringa. Salto i valori Non String per ora come soluzione alternativa, ma sono curioso di sapere se è possibile cercarli in tutti i campi.

Ad esempio, se l'utente desidera cercare un valore intero che ha come target il campo "Età" degli Oggetti, non riesco a farlo funzionare in questo modo.

public <T extends RealmObject> List<T> searchDatabase(Class<T> clazz, String searchQuery) { 

    /* Begin Query */ 
    RealmQuery<T> query = realmDatabase.where(clazz).beginGroup(); 

    Field[] fields = clazz.getDeclaredFields(); 

    for (int i = 0; i < fields.length; i++) { 

     /* Skip NON-String Values */ 
     if (!fields[i].getType().equals(String.class)) { 
      continue; 
     } 

     if (i == 0) { 
      query.contains(fields[i].getName(), searchQuery, false); 
     } else { 
      query.or().contains(fields[i].getName(), searchQuery, false); 
     } 
    } 

    /* Return All Objects Found */ 
    return query.endGroup().findAll(); 
} 

risposta

8

Cristiano dal Regno qui. Il motivo per cui il tuo codice non funziona è perché funziona solo per i campi String (http://realm.io/docs/java/api/io/realm/RealmQuery.html#contains-java.lang.String-java.lang.String-), quindi quando provi a usare con un campo intero, fallirà.

Se si desidera effettuare la ricerca per i diversi tipi di dati che sarà necessario per gettarli a tale, qualcosa come:

public <T extends RealmObject> List<T> searchDatabase(Class<T> clazz, String searchQuery) { 

    RealmQuery<T> query = realmDatabase.where(clazz).beginGroup(); 

    Field[] fields = clazz.getDeclaredFields(); 

    for (int i = 0; i < fields.length; i++) { 
     Class<?> type = fields[i].getType(); 
     String fieldName = fields[i].getName(); 

     if (i > 0) { 
      query.or() 
     } 

     if (type.equals(String.class)) { 
      query.contains(fieldName, searchQuery) 
     } else if (type.equals(Integer.class)) { 
      query.equalTo(fieldName, Integer.parseInt(searchQuery)) 
     } else { 
      ... 
     } 
    } 

    /* Return All Objects Found */ 
    return query.endGroup().findAll(); 
} 
+0

Grazie Christian, questo è quello che sto facendo ora. Ma pensavo che potesse esserci un modo per farlo nel Reame stesso. Ragazzi avete in programma di avere una sorta di metodo di query che possiamo interrogare in tutti i campi? qualcosa come 'query.containsAll (searchQuery)', indipendentemente dal nome del campo. – osayilgan

+0

Al momento non abbiamo piani, ma sentitevi liberi di creare una richiesta di funzionalità su GitHub. In questo caso è più facile discutere del caso d'uso esatto ed è più facile vedere se anche gli altri sono interessati a tale funzionalità. –

0

Verificare se è possibile utilizzare questo codice. Puoi coprire tutti i primitivi che penso. Ho aggiunto il codice per String, int e float.

import java.lang.reflect.Field; 

public class ReflectionTest { 
    String stringValue; 
    int intValue; 
    float floatValue; 

    public static void main(String[] args) { 
     Field[] fields = ReflectionTest.class.getDeclaredFields(); 

     for (Field field : fields) { 

      if (field.getType().toString().contains("int")) { 
       System.out.println("int Name \t" + field.getName()); 
      } 

      if (field.getType().toString().contains("float")) { 
       System.out.println("float Name \t" + field.getName()); 
      } 

      if (field.getType().toString().contains("String")) { 
       System.out.println("String Name \t" + field.getName()); 
      } 

     } 
    } 

} 
+0

cosa fa questo codice è, stampare i nomi dei campi. Trovare il tipo di campo è già implementato nel mio codice. Salto i valori Non String in modo simile. Leggi di nuovo la domanda e fammi sapere se non hai capito cosa sto chiedendo. – osayilgan

+0

Scusate il mio male, ho ottenuto la domanda. Se si dispone di un tipo non stringa dire intero, è possibile convertire intero in stringa (String.valueOf ([int/float/double/long/char/bolean]) e quindi utilizzare contiene metodo ?? –

+0

sì, possibile. Ma il problema è che non so se searchQuery è totalmente intero o String o misto di tipi diversi, sempre. Questo metodo deve essere il più generico possibile e deve funzionare con tutti i tipi di dati. – osayilgan

Problemi correlati