2015-04-22 9 views
6

मेरे पास रीयल डेटाबेस में विभिन्न प्रकार के ऑब्जेक्ट्स का एक सेट है। अब मैं उस ऑब्जेक्ट के सभी फ़ील्ड समेत कुछ प्रकार के ऑब्जेक्ट्स को क्वेरी करना चाहता हूं। नीचे दी गई विधि, ऑब्जेक्ट के सभी घोषित फ़ील्ड को फ़ील्ड पर प्राप्त कर रही है यह जांचने के लिए कि क्या दिया गया क्वेरी स्ट्रिंग निहित है या नहीं।दायरे डेटाबेस में क्वेरी: क्वेरी स्ट्रिंग युक्त सभी ऑब्जेक्ट खोजें

यह स्ट्रिंग फ़ील्ड प्रकारों के लिए ठीक काम करता है लेकिन पूर्णांक मानों के लिए java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER. फेंकता है क्योंकि मेरी खोज क्वेरी ऑब्जेक्ट स्ट्रिंग है। मैं अब वर्कअराउंड के रूप में गैर-स्ट्रिंग मानों को छोड़ देता हूं लेकिन अगर मैं इसे सभी क्षेत्रों में खोजना संभव हूं तो मैं उत्सुक हूं।

उदाहरण के लिए, यदि उपयोगकर्ता ऑब्जेक्ट्स के "आयु" फ़ील्ड को लक्षित करने वाला एक पूर्णांक मान खोजना चाहता है, तो मैं इसे इस तरह से काम नहीं कर सकता।

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

उत्तर

8

यहां से दायरे से ईसाई। आपका कोड काम नहीं करने का कारण है क्योंकि केवल स्ट्रिंग फ़ील्ड्स (http://realm.io/docs/java/api/io/realm/RealmQuery.html#contains-java.lang.String-java.lang.String-) के लिए काम करता है, इसलिए जब आप को एक पूर्णांक फ़ील्ड के साथ उपयोग करने का प्रयास करते हैं तो यह असफल हो जाएगा।

आप अलग अलग डेटाटाइप्स आप की तरह इस तरह के, कुछ करने के लिए उन्हें कास्ट करने के लिए की आवश्यकता होगी के लिए खोज करना चाहते हैं:

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

धन्यवाद ईसाई, यही वह है जो मैं अब कर रहा हूं। लेकिन मैंने सोचा कि रियलम में ऐसा करने का एक तरीका हो सकता है। क्या आप लोग एक तरह की क्वेरी विधि बनाने की योजना बना रहे हैं जिसे हम सभी क्षेत्रों में पूछ सकते हैं? फ़ील्ड नाम के बावजूद 'query.containsAll (searchQuery) 'जैसी कुछ। – osayilgan

+0

हमारे पास इस समय कोई योजना नहीं है, लेकिन गिटहब पर एक सुविधा अनुरोध तैयार करने के लिए स्वतंत्र महसूस करें। सटीक उपयोग के मामले पर चर्चा करना आसान है और यह देखना आसान है कि दूसरों को उस कार्यक्षमता में भी रूचि है या नहीं। –

0

जांचें कि क्या आप इस कोड का उपयोग कर सकते हैं। आप मुझे लगता है कि सभी प्राइमेटिव कवर कर सकते हैं। मैंने स्ट्रिंग, int और 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

क्या इस कोड को करता फील्ड नाम को प्रिंट, है। फ़ील्ड का प्रकार ढूंढना पहले से ही मेरे कोड में लागू किया गया है। मैं गैर-स्ट्रिंग मानों को इसी तरह से छोड़ देता हूं। प्रश्न फिर से पढ़ें, और मुझे बताएं कि क्या आपको समझ में नहीं आया कि मैं क्या पूछ रहा हूं। – osayilgan

+0

क्षमा करें मेरा बुरा, सवाल मिला। यदि आपके पास एक गैर स्ट्रिंग प्रकार इंटीजर कहता है, तो आप स्ट्रिंग (स्ट्रिंग.वल्यूओएफ ([int/float/double/long/char/bolean]) में पूर्णांक को परिवर्तित कर सकते हैं) और फिर विधि का उपयोग करें ?? –

+0

हाँ, संभव है। लेकिन समस्या यह है कि मुझे नहीं पता कि सर्चक्यू पूरी तरह से पूर्णांक है या स्ट्रिंग या विभिन्न प्रकार के मिश्रित, हर समय। इस विधि को जितना संभव हो उतना सामान्य होना चाहिए और सभी प्रकार के डेटा प्रकारों के साथ काम करना होगा। – osayilgan

संबंधित मुद्दे