user10072456
user10072456

Reputation: 1

How to get last node in Firebase?

I'm working on a chat app where user can see last message of conversation. But I am stuck with this situation where i am unable to get last message.

I have tried this query like

DatabaseReference getLastMessageRef = 
FirebaseDatabase.getInstance().getReference("FriendsMessages");
Query query1 = getLastMessageRef.child(common.currentUser.getPhone()).child(id).orderByKey().limitToLast(1);

Where common.currentUser.getPhone is number/id of current user and id is id of other person.

And database structure is like DATABASE STRUCTURE PICTURE

private void getAllMessages() {

    Query query = FirebaseDatabase.getInstance().getReference("FriendsMessages").child(common.currentUser.getPhone());
    FirebaseRecyclerOptions<MessageModel> options = new FirebaseRecyclerOptions.Builder<MessageModel>()
            .setQuery(query,MessageModel.class)
            .build();


    adapter = new FirebaseRecyclerAdapter<MessageModel, ShowAllMessageViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull final ShowAllMessageViewHolder holder, int position, @NonNull final MessageModel model) {


            String id = adapter.getRef(position).getKey();

            DatabaseReference getFriendDataRef = FirebaseDatabase.getInstance().getReference("User");
            DatabaseReference getLastMessageRef = FirebaseDatabase.getInstance().getReference("FriendsMessages");


            getFriendDataRef.child(id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()){

                        String dp = dataSnapshot.child("img").getValue().toString();
                        String name = dataSnapshot.child("name").getValue().toString();

                        holder.MessageName.setText(name);
                        Picasso.with(getBaseContext()).load(dp).into(holder.messageDp);

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


            Query query1 = getLastMessageRef.child(common.currentUser.getPhone()).child(id).orderByKey().limitToLast(1);

            query1.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    String mesaage = (String) dataSnapshot.child("message").getValue();

                    Toast.makeText(mContext, ""+mesaage, Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


        }

        @NonNull
        @Override
        public ShowAllMessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_message_view,parent,false);

            return new ShowAllMessageViewHolder(view);
        }
    };
    showAllMessages.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

I am getting null string.

Upvotes: 0

Views: 280

Answers (1)

Alex Mamo
Alex Mamo

Reputation: 138824

One thing to remember is that Firebase keys are always Strings. And when strings are ordered, are ordered lexicographically.

If you want to get the last element, add to each message object a new property that can hold a timestamp. This is how you can add it to the database and get it back. In the end, simply create a query and order the elements according to this new timestamp property and call limitToLast(1). That's it!

Upvotes: 1

Related Questions