2015-04-22 19 views
6

Mam zestaw różnych typów obiektów utrwalonych w bazie danych. Teraz chcę zapytać o określony typ obiektów, w tym wszystkie pola tego obiektu. Metoda, którą napisałem poniżej, pobiera wszystkie zadeklarowane pola obiektu i iteruje na polach, aby sprawdzić, czy dany ciąg zapytania jest zawarty.Kwerenda w bazie danych: Znajdź wszystkie obiekty zawierające ciąg zapytania

Działa poprawnie dla typów pól String, ale generuje wartości java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER., ponieważ obiektem zapytania jest ciąg znaków. Pomijam wartości Non-String na razie jako obejście, ale jestem ciekawy, czy możliwe jest przeszukiwanie go we wszystkich polach.

Na przykład, jeśli użytkownik chce przeszukiwać wartość całkowitą kierowaną na pole "Wiek" obiektów, nie mogę sprawić, aby działało to w ten sposób.

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(); 
} 

Odpowiedz

8

Christian z królestwa tutaj. Powód, dla którego twój kod nie działa, ponieważ działa tylko dla pól String (http://realm.io/docs/java/api/io/realm/RealmQuery.html#contains-java.lang.String-java.lang.String-), więc gdy spróbujesz użyć z polem całkowitym, to się nie powiedzie.

Jeśli chcesz szukać różnych typów danych trzeba będzie oddać je do takiego, coś takiego:

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

Dzięki Christian, właśnie to robię teraz. Ale myślałem, że w samym Królestwie może być sposób na zrobienie tego. Czy planujecie mieć jakąś metodę zapytania, którą możemy wysłać we wszystkich polach? coś jak 'query.containsAll (searchQuery)', niezależnie od nazwy pola. – osayilgan

+0

W tej chwili nie mamy żadnych planów, ale możesz utworzyć żądanie funkcji na GitHub. Tam łatwiej jest omówić dokładny przypadek użycia i łatwiej jest sprawdzić, czy inni są również zainteresowani tą funkcjonalnością. –

0

Sprawdź, czy możesz użyć tego kodu. Możesz opisać wszystkie prymitywy, które myślę. Dodałem kod dla String, int i 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

co ten kod robi to, drukowanie nazwy pól. Znalezienie typu pola jest już zaimplementowane w moim kodzie. Pomijam wartości inne niż łańcuchowe w podobny sposób. Przeczytaj ponownie to pytanie i daj mi znać, jeśli nie rozumiesz, o co pytam. – osayilgan

+0

Przepraszam, moje złe, mam pytanie. Jeśli masz typ inny niż łańcuchowy, powiedz Integer, możesz przekonwertować liczbę całkowitą na ciąg (String.valueOf ([int/float/double/long/char/bolean])), a następnie użyć metody zawierającej? –

+0

tak, możliwe. Problem polega jednak na tym, że nie wiem, czy wyszukiwarka jest całkowicie liczbą całkowitą, czy też ciągiem lub mieszaniem różnych typów przez cały czas. Ta metoda musi być tak ogólna, jak to możliwe i musi działać z wszystkimi typami danych. – osayilgan

Powiązane problemy