web-dev-qa-db-fra.com

Obtenez les données de Firebase en limite pour effectuer une extraction pour actualiser et charger plus de fonctionnalités

Pourtant, maintenant, j'obtiens toutes les données du FireBase en même temps. Ce que je veux faire, c'est obtenir des données dans [~ # ~] limite [~ # ~] comme 15 enregistre à la fois. Comme pour la première fois, l'utilisateur obtient les 15 enregistrements du Firebase et lorsque l'utilisateur charge plus de données en bas/en haut de l'écran, plus de 15 enregistrements devraient provenir de Firebase et ajoutés en bas/HAUT de la liste.

J'ai implémenté la logique pour obtenir les 15 enregistrements en haut OR bas de la base de données de Firebase comme ci-dessous: -

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) {

            }
        });

            }
        });
    }

J'ai cherché ici sur SO pour cela, mais je n'ai pas obtenu le résultat attendu, sous le lien que j'ai recherché)

1. Premier lien
2. Deuxième lien
3. troisième lien
4. Forth Link

Veuillez regarder ma structure de données Firebase dans l'image.
Data of firebase

J'ai implémenté la logique pour obtenir 15 OR 10 enregistrements à la première fois et cela fonctionne .. et j'ai également implémenté la logique pour charger plus d'enregistrements dans les limites mais n'obtient pas la bonne solution (NE FONCTIONNE PAS), aidez-moi et faites-moi savoir où je me trompe ... Merci :)

MODIFIER LA SOLUTION

: - J'ai implémenté la charge plus ou tirer pour actualiser la fonctionnalité sur ce lien: - Liste de défilement infinie Firebase Afficher 10 éléments en défilement

11
Ravindra Kushwaha

Il vous manque orderByKey(). Pour toute requête de filtrage, vous devez utiliser les fonctions de classement. Reportez-vous à la documentation

Dans votre méthode onRefresh, vous devez définir la limite:

 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() {
.....

Ainsi, les données que vous récupérez sont les 10 seuls nouveaux enregistrements après avoir obtenu vos 10 premiers enregistrements.

Veillez à enregistrer la clé la plus ancienne des données nouvellement récupérées afin que lors de la prochaine actualisation, les nouvelles données de cette clé ne soient récupérées.

Suggestion: Au lieu d'ajouter un écouteur de valeur enfant pour trouver la dernière clé, vous pouvez simplement utiliser l'écouteur de valeur et obtenir le dernier instantané de données avec la taille à obtenir la clé du dernier enregistrement.

9
kirtan403

restructurer votre base de données, définir un nouvel identifiant enfant qui est incrémentiel comme 0,1,2,3 ... etc

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

puis faites une méthode pour la requête

public void loadFromFirebase(int startValue,int endValue){

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

assurez-vous d'avoir implémenté addListenerForSingleValueEvent puis effectuez la tâche associée à l'adaptateur. Appelez initialement à partir de la méthode onCreate:

loadFromFirebase(0,10);

NB: en chargeant du nouveau contenu dans la liste vous devez être au courant avec l'adaptateur.

3
Milon