Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取Firebase中的最后一个节点?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Java 如何获取Firebase中的最后一个节点?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在开发一个聊天应用程序,用户可以在其中查看对话的最后一条消息。但我被困在这种情况下,我无法得到最后的消息 我试过这样的查询 DatabaseReference getLastMessageRef = FirebaseDatabase.getInstance().getReference("FriendsMessages"); Query query1 = getLastMessageRef.child(common.currentUser.getPhone()).child(id).ord

我正在开发一个聊天应用程序,用户可以在其中查看对话的最后一条消息。但我被困在这种情况下,我无法得到最后的消息

我试过这样的查询

DatabaseReference getLastMessageRef = 
FirebaseDatabase.getInstance().getReference("FriendsMessages");
Query query1 = getLastMessageRef.child(common.currentUser.getPhone()).child(id).orderByKey().limitToLast(1);
其中,
common.currentUser.getPhone
是当前用户的号码/id,id是其他人的id

数据库结构如下

private void getAllMessages(){
Query Query=FirebaseDatabase.getInstance().getReference(“FriendsMessages”).child(common.currentUser.getPhone());
FirebaseRecyclerOptions选项=新建FirebaseRecyclerOptions.Builder()
.setQuery(查询,MessageModel.class)
.build();
适配器=新的FirebaseRecyclerAdapter(选项){
@凌驾
受保护的无效onBindViewHolder(@NonNull final ShowAllMessageViewHolder,int位置,@NonNull final MessageModel模型){
字符串id=adapter.getRef(位置).getKey();
DatabaseReference getFriendDataRef=FirebaseDatabase.getInstance().getReference(“用户”);
DatabaseReference getLastMessageRef=FirebaseDatabase.getInstance().getReference(“FriendsMessages”);
getFriendDataRef.child(id).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
字符串dp=dataSnapshot.child(“img”).getValue().toString();
字符串名称=dataSnapshot.child(“名称”).getValue().toString();
holder.MessageName.setText(名称);
Picasso.with(getBaseContext()).load(dp).into(holder.messageDp);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
查询query1=getLastMessageRef.child(common.currentUser.getPhone()).child(id.orderByKey().limitToLast(1);
query1.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
字符串mesage=(字符串)dataSnapshot.child(“消息”).getValue();
Toast.makeText(mContext,“+mesage,Toast.LENGTH_SHORT.show();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
@非空
@凌驾
public ShowAllMessageViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(右布局、卡片信息视图、父视图、假);
返回新的ShowAllMessageViewHolder(视图);
}
};
showAllMessages.setAdapter(适配器);
adapter.notifyDataSetChanged();
}

我得到了空字符串。

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


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

嗨,亚历克斯,谢谢你的回答,但我只是想问一下我的问题是否正确不?不,不是。它将不会根据时间组件返回最后一项。它将重新运行最后一个元素。您不能根据这些字符串进行排序,并期望其表现为时间戳。我只需要最后一个元素,但它正在检索它。给我空错误您是否尝试在查询中对
common.currentUser.getPhone()
id
的值进行硬编码
query1=getLastMessageRef.child(common.currentUser.getPhone()).child(id.orderByKey().limitToLast(1)?它是这样工作的吗?是的,我传递了查询query1=getLastMessageRef.child(common.currentUser.getPhone()).child(id.child(“节点名称”);而且还在工作
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();
}