从Firebase中获取数据的限制,以执行刷新以及加载更多功能 [英] Get the data from the Firebase in limit to perform pull to refresh and load more functionality

查看:135
本文介绍了从Firebase中获取数据的限制,以执行刷新以及加载更多功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

然而,现在我正在从 FireBase 中获取所有数据。我想要的是,在 LIMITS em> 15 记录在一个时间。就像第一次用户从 Firebase 中获得15条记录一样,当用户在屏幕的底部/顶部加载更多的数据时,比另外15条记录应该来自 Firebase 并添加到列表的底部/顶部。



我已经实现了将顶部或底部的15条记录的数据库从 Firebase 类似如下:
$ b $ pre $ public class ChatActivity extends AppCompatActivity实现FirebaseAuth.AuthStateListener {

私有FirebaseAuth mAuth;
private DatabaseReference mChatRef;

私人查询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);
$ b $ /////获取SWIPE布局的视图ID
swipeRefreshLayout =(SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout);
$ b $ // ///从这里的FIREBASE获得第一个10条记录
mChatRef.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public (DataSnapshot child:dataSnapshot.getChildren()){
oldestPostId = child.getKey();
System.out.println(这里是数据的数据快照(DataSnapshot dataSnapshot) ==>>+ child.getKey());
}
}

@Override
public void onCancelled(DatabaseError databaseError){

}
});

//////为了更新刷新代码就在这里
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener(){
@Override
public void onRefresh (){
//刷新项目

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

// / HEREoldestPostId是我从FIREBASE获取最新记录的关键

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

System.out.println(here AFTER data added ==>>)+ onDataChange(DataSnapshot dataSnapshot){
child.getKey());
}
}

@Override
public void onCancelled(DatabaseError databaseError){

}
});

}
});





$ b我已经在这里搜索了SO,但没有得到预期的结果,下面我已经搜索过它的链接


1.



我已经实现了第一次获得15或10条记录的逻辑,它的工作原理也实现了加载更多记录的限制逻辑,但是 解决方案(不工作) ,请帮助,让我知道在哪里我不知道怎么解决这个问题,但是我不知道怎么解决这个问题,但是我不知道怎么解决这个问题。 C>。对于任何过滤查询,您必须使用排序功能。请参阅文档



onRefresh 方法中,您需要设置限制:

  public void onRefresh(){
//刷新项目
///这里oldestPostId是我从FIREBASE获取最新记录的关键
mChatRef.orderByKey ).startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener(){
.....

因此,您获取的数据是您获得前10条记录后仅有的10条新记录。



确保保存新检索的数据,以便在下一次刷新时,只能检索此键的新数据。



建议:而不是添加子值侦听器最后一个键,您可以使用值侦听器并获取大小为的最后一个数据快照得到最后一个记录的关键。


Yet now i am getting the all data from the FireBase at one time.What i want to do that getting data in LIMITS like 15 records at a time. Like in first time user get the 15 records from the Firebase and when user load more data at the bottom/TOP of the screen than 15 more records should come from Firebase and added to the bottom/TOP of the list.

I have implemented the logic to get the 15 records at a top OR bottom of the database from Firebase like below:-

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

            }
        });

            }
        });
    }

I have searched here on SO for it , but did not get the expected result, below link which i have searched for it

1. First Link
2. Second Link
3. Third Link
4. Forth Link

Please look at my firebase data structure in image.

I have implemented the logic for the getting 15 OR 10 records at first time and it works..and also implemented the logic for loading more records in limits but not getting proper solution (NOT WORKING) , please help and let me know where am i doing wrong..Thanks :)

解决方案

You are missing orderByKey(). For any filtering queries you must use the ordering functions. Refer to the documentation

In your onRefresh method you need to set the limit:

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

So the data you retrieve is the only 10 new records after you got your first 10 records.

Make sure to save the oldest key of the newly retrieved data so that on next refresh new data from this key is only retrieved.

Suggestion: Instead of adding a child value listener to find the last key, you can just use the value listener and get the last data snapshot with the size to get the last record's key.

这篇关于从Firebase中获取数据的限制,以执行刷新以及加载更多功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆