2017-02-28 4 views
9

लोड फिर भी अब मैं एक समय है.क्या पर FireBase से सभी डेटा हो रही है मैं करना चाहता हूँ करने के लिए कि सीमा में डेटा प्राप्त करने 15 की तरह एक समय में रिकॉर्ड। पहली बार उपयोगकर्ता को Firebase से 15 रिकॉर्ड प्राप्त होते हैं और जब उपयोगकर्ता स्क्रीन के नीचे/शीर्ष पर अधिक डेटा लोड करते हैं तो 15 से अधिक रिकॉर्ड Firebase से आते हैं और सूची के नीचे/शीर्ष में जोड़े जाते हैं।

मैं नीचे की तरह Firebase से डेटाबेस के एक शीर्ष या तल पर 15 रिकॉर्ड प्राप्त करने के लिए तर्क को लागू किया है: -पुल प्रदर्शन करने के लिए सीमा में Firebase से डेटा प्राप्त करें ताज़ा करें और अधिक कार्यक्षमता

public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener { 

    private FirebaseAuth mAuth; 
    private DatabaseReference mChatRef; 

    private Query postQuery; 
    private String newestPostId; 
    private String oldestPostId; 
    private int startAt = 0; 
    private SwipeRefreshLayout swipeRefreshLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuth.addAuthStateListener(this); 

     mChatRef = FirebaseDatabase.getInstance().getReference(); 
     mChatRef = mChatRef.child("chats"); 

     /////GETTING THE VIEW ID OF SWIPE LAYOUT 
     swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); 

    /////GETTING FIRST 10 RECORDS FROM THE FIREBASE HERE 
     mChatRef.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 
        oldestPostId = child.getKey(); 
        System.out.println("here si the data==>>" + child.getKey()); 
       }  
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     //////FOR THE PULL TO REFRESH CODE IS HERE 
     swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       // Refresh items 

      System.out.println("Here==>>> "+oldestPostId); 

       ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE 

       mChatRef.startAt(oldestPostId).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 

        System.out.println("here AFTER data added==>>" + child.getKey()); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

      } 
     }); 
    } 

मैं इसके लिए इतने पर यहाँ की खोज की है, लेकिन उम्मीद नहीं जा सके थे परिणाम, लिंक नीचे मैं के लिए यह

1. First Link
2. Second Link
3. Third Link
4. Forth Linkखोज की है जो

कृपया छवि में मेरी फायरबेस डेटा संरचना देखें।
Data of firebase

मैं पहली बार में हो रही 15 या 10 रिकॉर्ड के लिए तर्क लागू कर दिया है और यह भी नहीं मिल रहा उचित समाधान (काम नहीं) सीमा में अधिक रिकॉर्ड लोड करने के लिए तर्क लागू किया works..and लेकिन कृपया मदद करें और मुझे बताएं कि मैं कहां गलत कर रहा हूं..धन्यवाद :)

+0

https://github.com/milon87/ShakeTopUp/tree/master/app/src/main/java/xyz/enableit/shaketopup/offer आप इसे देख सकते हैं। हालांकि एमवीपी द्वारा इसे लागू किया गया है। बस ModelOfferImpl.java फ़ाइल की जांच करें। उम्मीद है कि यह मदद करेगा। –

+0

इस समस्या का पूरा समाधान प्राप्त करने के लिए इसे देखें: - https://stackoverflow.com/a/44796538/3946958 –

उत्तर

7

आप orderByKey() खो रहे हैं। किसी भी फ़िल्टरिंग प्रश्नों के लिए आपको ऑर्डरिंग फ़ंक्शंस का उपयोग करना होगा।

public void onRefresh() { 
    // Refresh items 
    ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE 
       mChatRef.orderByKey().startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() { 
..... 

तो डेटा आप पुनः प्राप्त है केवल 10 नए रिकॉर्ड के बाद आप अपने पहले 10 रिकॉर्ड मिला: अपने onRefresh विधि में documentation

का संदर्भ लें आप सीमा निर्धारित करने की जरूरत है।

नए पुनर्प्राप्त डेटा की सबसे पुरानी कुंजी को सहेजना सुनिश्चित करें ताकि इस कुंजी से अगले ताज़ा नए डेटा को पुनर्प्राप्त किया जा सके।

सुझाव: अंतिम कुंजी खोजने के लिए एक बाल मूल्य श्रोता जोड़ने के बजाय, आप केवल मूल्य श्रोता का उपयोग कर सकते हैं और अंतिम रिकॉर्ड की कुंजी प्राप्त करने के लिए आकार के साथ अंतिम डेटा स्नैपशॉट प्राप्त कर सकते हैं।

+0

क्या आप अपने सुझाव के लिए उदाहरण दिखा सकते हैं? इसके अलावा, किसी कारण से मैं आपके जैसा ही उपयोग कर रहा हूं लेकिन मुझे मिल रहा है: 'java.lang.IllegalArgumentException: आपको startAt (स्ट्रिंग मान), endAt (स्ट्रिंग मान) या बराबर (स्ट्रिंग मान) का उपयोग ऑर्डर के साथ संयोजन में करना होगा() । अन्य प्रकार के मान या 2 पैरामीटर वाले संस्करण का उपयोग करने के लिए समर्थित नहीं है ' मेरा कोड' photoRerence.orderByKey() है। StartAt (oldestPostId) .limitToFirst (6) .addListenerForSingleValueEvent (नया ValueEventListener() {' –

+0

@TalC इसे काम करना चाहिए आपकी त्रुटि वही बात बताती है जैसा मैंने पहले अपने उत्तर में बताया था। क्या आप वाकई साझा की गई उसी पंक्ति में त्रुटि प्राप्त कर रहे हैं, क्योंकि यह मेरे लिए ठीक लगता है। – kirtan403

+0

मुझे उस पंक्ति में त्रुटि मिल रही है। मैं सोच रहा हूं यह उस विशिष्ट कुंजी के कारण हो सकता है जिसे इसे कॉल करने से पहले समय में लोड नहीं किया जा रहा है। यह मेरे लिए एक अलग पुस्तकालय का उपयोग कर रहा है जो इस समय मेरे ऐप में छोटी गाड़ी है। इसलिए मैंने पुस्तकालय शुरू किया और फिर यह तुरंत अनुरोध करने का प्रयास करता है फायरबेस से जानकारी यही कारण है कि मैं इसे दुर्घटनाग्रस्त कर रहा हूं। अगर मैं मैन्युअल रूप से कुंजी डालता हूं तो यह काम करता है। ऐसा लगता है कि मुझे इस बग को ठीक करने के लिए एक बग ठीक करना है। उम्मीद है कि यह काम करता है। धन्यवाद हालांकि! फिक्स एक बग, 99 और लॉल प्राप्त करें। –

2

पुनर्गठन अपने डेटाबेस, एक नए बच्चे आईडी जो 0,1,2,3 तरह वृद्धिशील है ... आदि

"chats": { 
"-KZLKDF": { 
    "id": 0, 
    "message": "Hi", 
    "name":"username" 
}, 

फिर क्वेरी के लिए एक विधि बनाने के सेट

public void loadFromFirebase(int startValue,int endValue){ 

mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this); 
} 

सुनिश्चित करें आपने addListenerForSingleValueEvent लागू किया है, फिर एडाप्टर से संबंधित कार्य करें। प्रारंभ में onCreate विधि से फोन:

loadFromFirebase(0,10); 

एनबी: सूची आप एडाप्टर के साथ बारे में पता होना करने के लिए है में नई सामग्री लोड हो रहा है।

+0

आपके उत्तर के लिए धन्यवाद .. आपके प्रयास के लिए +1 .. @ kirtan403 ने मेरी समस्या हल कर दी है .. इनपुट के लिए धन्यवाद –

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

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