2016-08-28 16 views
7

मैं orderByChild और equalTo (शांत है कि यह रूप में अच्छी तरह नेस्टेड बच्चे के लिए काम करता है)Firebase: क्वेरी एक शर्त के आधार पर डेटा बहिष्कृत करने

private void getData() { 
     try { 
      final DatabaseReference database = FirebaseDatabase.getInstance().getReference(); 

      database.child(Constants.TABLE_TASKS).orderByChild("user/id") 
        .equalTo("somevalue") 
        .addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          Timber.d(dataSnapshot.toString()); 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 
         } 
        }); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

का उपयोग कर बच्चे में एक विशेष मूल्य के लिए डेटा प्राप्त करने में सक्षम हूँ क्या डेटा प्राप्त करने का कोई आसान तरीका है जहां कोई विशेष मूल्य नहीं मिला है, मूल रूप से notEqualTo("somevalue") जैसा कुछ है?

+0

संदर्भ निकाला गया के रूप में Child2 प्राप्त टिप्पणियों साफ़ –

+0

पसंद करने के लिए होगा। मुझे डर है कि मेरे पास और भी बुरी खबर है ... –

उत्तर

10

मुझे लगता है मैं समाधान मिल गया है और यह कैसे डेटाबेस तैयार किया जाना चाहिए की अधिक है और वास्तव में अब मैं Firebase दिशानिर्देश के पीछे इरादा समझ गया है

https://firebase.google.com/docs/database/android/structure-data

मूल डिजाइन:

{ 
    child1: { 
     "user": { 
     "id": "id1", 
     "name": "puf" 
     } 
    }, 
    child2: { 
     "user": { 
     "id": "id2", 
     "name": "abe" 
     } 
    }, 
    child3: { 
     "user": { 
     "id": "id1" 
     "name": "puf" 
     } 
    } 
} 

अपडेट किया गया डिजाइन:

तो अलग

आईडी और उपयोगकर्ता का नाम संग्रहीत करने से, हम भी कुंजी के रूप में आईडी के साथ ही एक नोड संग्रहीत करना चाहिए और अद्यतन डिजाइन के साथ सच

{ 
    child1: { 
     "user": { 
     "id": "id1", 
     "name": "puf" 
     "id1": true 
     } 
    }, 
    child2: { 
     "user": { 
     "id": "id2", 
     "name": "abe" 
     "id2": true 
     } 
    }, 
    child3: { 
     "user": { 
     "id": "id1" 
     "name": "puf" 
     "id1": true 
     } 
    } 
} 

को चिह्नित, अगर मैं निष्पादित ref.orderByChild('user/id1').equalTo(true)

मैं Child1 एवं बाल 3

के रूप में आउटपुट प्राप्त होता है और अगर मैं निष्पादित ref.orderByChild('user/id1').equalTo(null),

मैं उत्पादन

+0

दिलचस्प दृष्टिकोण, संग्रहीत डेटा में थोड़ा अधिक महंगा, लेकिन निश्चित रूप से उपयोगी – davidtaubmann

+0

यह मेरा समय बचाया। –

13

में फायरबेस क्वेरी मॉडल आप असमानता के लिए फ़िल्टर पर फ़िल्टर नहीं कर सकते हैं।

लेकिन किसी भी मूल्य की अनुपस्थिति (अनिवार्य रूप से: किसी संपत्ति की अनुपस्थिति) के लिए परीक्षण कर सकते हैं। इस डेटा मॉडल के साथ उदाहरण के लिए:

{ 
    child1: { 
     "user": { 
     "id": 1, 
     "name": "puf" 
     } 
    }, 
    child2: { 
     "user": { 
     "id": 2, 
     "name": "abe" 
     } 
    }, 
    child3: { 
     "user": { 
     "id": 3 
     } 
    } 
} 

मैं के साथ एक user/name संपत्ति के बिना बच्चों के लिए क्वेरी कर सकते हैं:

ref.orderByChild('child/name').equalTo(null) 

कौन सा एकमात्र संतान की ओर जाता है कि एक नाम नहीं है:

child3

मेरे जेएसबीएन के साथ खेलने के लिए स्वतंत्र महसूस करें यह देखने के लिए कि क्या आप आगे बढ़ते हैं: http://jsbin.com/liyibo/edit?js,console

अद्यतन: मुझे पता था कि मैंने पहले इसका जवाब दिया था, लेकिन इसे पहले नहीं मिला। यहां डुप्ले है: is it possible query data that are not equal to the specified condition?। ऐसा लगता है कि मुझे वहां एक गलती है, क्योंकि स्पष्ट रूप से मैं उपरोक्त कोड में किसी संपत्ति की अनुपस्थिति के लिए परीक्षण कर रहा हूं।

+0

धन्यवाद, फ्रैंक! लेकिन आम तौर पर उपयोगकर्ता के मामले में, अगर मैं किसी बच्चे को किसी निश्चित उपयोगकर्ता द्वारा नहीं बनाया गया था, तो मैं फ़िल्टर करना चाहता हूं या नहीं ..in ऐसे मामलों में आईडी/नाम शून्य नहीं होगा –

+2

मुझे पता है। इसलिए बोल्ड में पहली पंक्ति: आपके "मार्कर मान" से भिन्न मान वाले नोड्स पर फ़िल्टर करने का कोई तरीका नहीं है। क्षमा करें मेरे पास बेहतर समाचार नहीं है। –

+1

धन्यवाद, फ्रैंक! तत्काल उत्तर के लिए धन्यवाद। तो मुझे लगता है कि क्लाइंट पर सभी मूल्यों को प्राप्त करने का एकमात्र तरीका होगा और इसे वहां फ़िल्टर करें (हालांकि थोड़ा महंगा ऑपरेशन)। मुझे आशा है कि इस तरह की सुविधा को नए रिलीज में कार्यान्वित किया जा सकता है :) –

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