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

标签 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();
}

我得到空字符串。

最佳答案

要记住的一件事是 Firebase 键始终是字符串。当字符串排序时,是 ordered lexicographically .

如果您想获取最后一个元素,请向每个消息对象添加一个可以保存时间戳的新属性。 <强> This 是将其添加到数据库并取回的方式。最后,只需创建一个查询并根据这个新的时间戳属性对元素进行排序,然后调用 limitToLast(1)。就是这样!

关于java - 如何获取 Firebase 中的最后一个节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54654368/

相关文章:

java - Xmlparser.getText() 给出 null

java - Firestore - 为什么要检查 DocumentSnapshot 是否不为空并且调用是否存在?

firebase - 如何修复我的 Application.java 以使用新版本的 Firebase_messaging

java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : -65

java - 将特定请求重定向到另一个域

Java Swing : List Models and Collections

java - 如何使用 Java 从 Google Cloud Storage 服务器端的视频创建缩略图或 jpeg 图像

java - java中的setSoTimeout方法改变哪个定时器?

android - 如何在android中打开本地PDF?

firebase - Firebase 存储是否为文件提供唯一 ID?