java - नोड फायरबेस में अद्वितीय यादृच्छिक उत्पाद कैसे प्राप्त करें?



android firebase (1)

खैर, SOF पर यहाँ कुछ अच्छे उत्तर हैं, लेकिन अलग किए गए हैं, इसलिए मैं आपके प्रश्न का उत्तर दो तरीकों से देने का प्रयास करूँगा।

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

वास्तविक उत्तर:

यह मानते हुए कि आपकी डेटाबेस संरचना इस तरह दिखती है (जिसमें products नोड आपके फायरबेस डेटाबेस का प्रत्यक्ष बच्चा है):

Firebase-root
   |
   --- products
         |
         --- productIdOne
         |      |
         |      --- name: "gjwj"
         |      |
         |      --- category: "hreggrrg"
         |      |
         |      --- location: "vjhiwehifwe"
         |      |
         |      --- price: 44
         |      |
         |      --- color: "fassaf"
         |
         --- productIdTwo
         |      |
         |      --- name: "uygfwh"
         |      |
         |      --- category: "hhhjwwwom"
         |      |
         |      --- location: "pervrr"
         |      |
         |      --- price: 33
         |      |
         |      --- color: "yrtrr"
         |
         --- //And so on

एक यादृच्छिक उत्पाद प्राप्त करने के लिए, कृपया निम्नलिखित कोड का उपयोग करें:

List<String> randomProductList = new ArrayList<>();
ListView listView = (ListView) findViewById(R.id.list_view);
ArrayAdapter arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, randomProductList);
listView.setAdapter(arrayAdapter);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productsRef = rootRef.child("products"); //Added call to .child("products")
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> productList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            productList.add(name);
        }

        int productCount = productList.size();
        int randomNumber = new Random().nextInt(productCount);

        randomProductList.add(productList.get(randomNumber)); //Add the random product to list
        arrayAdapter.notifyDatasetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
    }
};
productsRef.addListenerForSingleValueEvent(valueEventListener);

सभी उत्पादों को प्राप्त करने के लिए, आपको सभी products नोड के माध्यम से लूप करने की products है। तो child("products") लिए एक कॉल अनिवार्य है।

यदि आप अधिक चाहते हैं तो एक यादृच्छिक उत्पाद, फिर आप एक लूप बना सकते हैं और अपने यादृच्छिक उत्पाद में जितने चाहें उतने यादृच्छिक उत्पाद जोड़ सकते हैं।

इसे क्लासिक समाधान कहा जाता है और आप इसे नोड्स के लिए उपयोग कर सकते हैं जिसमें केवल कुछ रिकॉर्ड होते हैं लेकिन यदि आप बड़ी मात्रा में डेटा प्राप्त करने से डरते हैं तो मैं आपको इस दूसरे दृष्टिकोण की सिफारिश करूंगा। इसमें productIds नाम का एक नया नोड जोड़कर अपने डेटाबेस में थोड़ा बदलाव भी शामिल है। आपकी डेटाबेस संरचना इस तरह दिखनी चाहिए:

Firebase-root
   |
   --- products
   |     |
   |     --- productIdOne
   |     |      |
   |     |      --- //details
   |     |
   |     --- productIdTwo
   |            |
   |            --- //details
   |      
   --- productIds
          |
          --- productIdOne: true
          |
          --- productIdTwo: true
          |
          --- //And so on

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

इस प्रथा को डिनोमिनेशन (डेटा को डुप्लिकेट करना) कहा जाता है और फायरबेस की बात आती है तो यह एक आम बात है। एक बेहतर समझ के लिए, मुझे लगता है कि आप इस वीडियो को देखते हैं, फायरबेस डेटाबेस के साथ अपसरण सामान्य है

लेकिन रिमेम्ब्र, जिस तरह से आप इस नए बनाए गए नोड में यादृच्छिक उत्पादों को जोड़ रहे हैं, उसी तरह से आपको उन्हें हटाने की ज़रूरत है जब ज़रूरत नहीं होती है।

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productIdsRef = rootRef.child("productIds");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> productIdsList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String productId = ds.getKey();
            productIdsList.add(productId);
        }

        int productCount = productIdsList.size();
        int randomNumber = new Random().nextInt(productCount);

        DatabaseReference productIdRef = rootRef.child("products").child(productIdsList.get(randomNumber));
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String name = dataSnapshot.child("name").getValue(String.class);
                Log.d("TAG", name);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
            }
        };
        productIdRef.addListenerForSingleValueEvent(eventListener);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, "Error: ", task.getException()); //Don't ignore errors!
    }
};
productIdsRef.addListenerForSingleValueEvent(valueEventListener);

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

डेटा:

- products
   - -L74Pc7oVY22UsCETFBv
       - name: "gjwj"
       - category: "hreggrrg"
       - location: "vjhiwehifwe"
       - price: 44
       - color: fassaf
   - -L74uJ7oVYcVNyCteFBz
       - name: "uygfwh"
       - category: "hhhjwwwom"
       - location: "pervrr"
       - price: 33
       - color: yrtrr
   ......................

मेरे पास कई उत्पादों में नोड products , 1000 से अधिक उत्पाद हैं। मैं सभी ListView में प्रदर्शित कर सकता हूं। मैं उपयोगकर्ता को केवल एक अद्वितीय यादृच्छिक प्रदर्शित करना चाहता हूं, जैसे हाइलाइट, लेकिन सभी को डाउनलोड करने के लिए नहीं, केवल एक।

कोड:

ValueEventListener v = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot child : dataSnapshot.getChildren()) {
            String name = (String) child.child("name").getValue().toString();
            Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
            //How to get?????
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
FirebaseDatabase.getInstance().getReference().addListenerForSingleValueEvent(v);

नोड फायरबेस में अद्वितीय यादृच्छिक उत्पाद कैसे प्राप्त करें?





firebase-realtime-database