代码之家  ›  专栏  ›  技术社区  ›  Murlidhar Fichadia

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

  •  1
  • Murlidhar Fichadia  · 技术社区  · 6 年前

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

    我的数据看起来像: data structure

    最初,我加载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()的不同组合,但似乎没有任何效果。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stevie    6 年前

    试试这个:

     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);
        }
    

    对我来说效果很好。祝你好运