从Firebase获取数据限制,以执行提取以刷新并加载更多功能

时间:2017-02-28 06:50:37

标签: android firebase firebase-realtime-database firebase-storage

但是现在我一次从FireBase获取所有数据。我想做的是在 LIMITS 中获取数据,如 15 记录一时间就像第一次用户从Firebase获取15条记录一样,当用户在屏幕底部/ TOP加载更多数据时,15条记录应来自Firebase并添加到底部/ TOP清单。

我已经实现了逻辑,从Firebase获取数据库顶部或底部的15条记录,如下所示: -

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

            }
        });

            }
        });
    }

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

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

请查看我的firebase数据结构图。
Data of firebase

我已经实现了第一次获取15 OR 10记录的逻辑并且它可以运行..并且还实现了在极限中加载更多记录的逻辑,但 没有得到正确的解决方案(不工作)< / em> ,请帮忙,让我知道我在哪里做错了。谢谢:)

2 个答案:

答案 0 :(得分:8)

您缺少orderByKey()。对于任何过滤查询,您必须使用排序函数。请参阅documentation

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

 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条新记录。

确保保存新检索数据的最旧密钥,以便下次刷新时只检索此密钥中的新数据。

建议:您可以只使用值侦听器并获取具有大小的最后一个数据快照来获取最后一个记录,而不是添加子值侦听器来查找最后一个键。键。

答案 1 :(得分:3)

重组数据库,设置一个新的子ID,如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);

注意:使用适配器在您需要注意的列表中加载新内容。