如何获取Firebase中的最后一个节点?

时间:2019-02-12 16:16:01

标签: java android firebase firebase-realtime-database

我正在使用一个聊天应用程序,用户可以在其中查看会话的最新消息。但是我无法获得最新消息。

我尝试了

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

其中common.currentUser.getPhone是当前用户的编号/ id,而id是其他人的ID。

数据库结构类似于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();
}

我得到的是空字符串。

1 个答案:

答案 0 :(得分:1)

要记住的一件事是Firebase密钥始终是字符串。并在订购字符串时为ordered lexicographically

如果要获取最后一个元素,请向每个消息对象添加可以容纳timestamp的新属性。 This 是将其添加到数据库并取回数据库的方法。最后,只需创建一个查询并根据此新的timestamp属性对元素进行排序,然后调用limitToLast(1)。就是这样!