Java 如何使用时间戳获取范围内的数据-Firebase、Android、实时数据库

Java 如何使用时间戳获取范围内的数据-Firebase、Android、实时数据库,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我使用firebase实时数据库来存储和检索数据,但由于某些原因,我无法实现我想要的 我想在滑动刷新布局上一次获得20条记录 我的数据如下所示: 最初,我加载50条记录: chat.limitToLast(default_num_of_messages).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot

我使用firebase实时数据库来存储和检索数据,但由于某些原因,我无法实现我想要的

我想在滑动刷新布局上一次获得20条记录

我的数据如下所示:

最初,我加载50条记录:

chat.limitToLast(default_num_of_messages).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Map map = dataSnapshot.getValue(Map.class);
                String user_id =  map.get("user_id").toString();
                String message = map.get("message").toString();
                String timestamp = map.get("timestamp").toString();

                Log.d("MAP", map.toString());
                ChatMessage chat_message = new ChatMessage();
                chat_message.setUser_id(user_id);
                chat_message.setMessage(message);
                chat_message.setTimestamp(Long.parseLong(timestamp));
                Log.d("CHAT MSG", chat_message.toString());

                if(Integer.parseInt(user_id) == Utils.getInstance().getLoggedInUser().getId()) {
                    addMessageBox(chat_message, 1);
                }
                else{
                    addMessageBox(chat_message, 2);
                }
            }
刷新后,我想再加载20个。我正在尝试做类似的事情。但它似乎没有回来

@Override
public void onRefresh() {
    if(refresh_toggle) {
        swipe_view.setRefreshing(true);
        Log.d("CHAT", "REFRESHED!!!");
        //reload new data
        chat.orderByChild("timestamp").endAt(10).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Map map = dataSnapshot.getValue(Map.class);
                String user_id =  map.get("user_id").toString();
                String message = map.get("message").toString();
                String timestamp = map.get("timestamp").toString();

                Log.d("CHATS", map.toString());
                ChatMessage chat_message = new ChatMessage();
                chat_message.setUser_id(user_id);
                chat_message.setMessage(message);
                chat_message.setTimestamp(Long.parseLong(timestamp));

                swipe_view.setRefreshing(false);
                if(Integer.parseInt(user_id) == Utils.getInstance().getLoggedInUser().getId()) {
                    addMessageBox(chat_message, 1);
                }
                else{
                    addMessageBox(chat_message, 2);
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {}

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

            @Override
            public void onCancelled(FirebaseError firebaseError) {}
        });
    }
}
正如您所看到的,我正在尝试orderByChild“timestamp”,然后尝试了startAt()和endAt()的不同组合,但似乎没有任何效果

试试这个:

 int number_item_load = 10; //changed number if you want
    public void loadMore(int offset, String theLastValue) {
        // theLastValue: depend on your orderByChild() 's value
        mDatabase = FirebaseDatabase.getInstance().getReference().child(Utils.FB_ROOT);
        mEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                if (isAlreadyAttach()) {
                    // Get your item and callback to view and insert to listView
                }
            } ...
        };


        mDatabase.orderByChild("yourvalue").startAt(theLastValue).limitToFirst(number_item_load ).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // TODO Finished loaded number_item_load  item
                OnLoadedFinish(); // 
                mDatabase.removeEventListener(mEventListener); // Remove listener after load
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        mDatabase.orderByChild("yourvalue").startAt(theLastValue).limitToFirst(number_item_load ).addChildEventListener(mEventListener);
    }

对我来说,它非常有效。Goodluck

您的数据是混合的还是已经排序?@Thiệ已经分类了。我所需要的是一种从当前点一次拉20的方法。我可以使用timestamp跟踪最后一条记录,但我想使用这些timestamp值获取下一个20records@Thien科皮特斯在我的情况下“idLastOne”是什么?我怎么才能得到一个我已经对我的代码发表了评论,这是你最后一个dataSnapshot键。必须知道他将从哪里开始。例如:您第一次加载了15个聊天。您正在加载10个以上的聊天项目。“Idastone”这是您已经加载的第15项的dataSnapshot键。@Thien Kopites是的,我知道它用于跟踪和获取下一个值,但如何获取键,我可以执行dataSnapshot.key()?@MurlidharFichadia那么,您的聊天ID是什么??您可以为聊天项目id设置dataSnapshot.key(),否则您可以在我的代码中再次检查,我更新了最后一个问题。我需要什么才能将它传递给endAt()。我的钥匙是:-LMi2xWN。。。等等,我以为endAt会使用时间戳,但我不知道endAt会接受什么。我不能把int传递给它。