首页 > 解决方案 > com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.chocolate.ModelChatlist 类型

问题描述

我正在尝试从 Firebase 实时数据库中检索数据,并希望在 TextView 的屏幕上显示它们,但遇到错误。

logcat 中显示的错误是: 在此处输入图像描述

ChatListFragment 类的代码如下:

public class ChatListFragment extends Fragment {

  FirebaseAuth firebaseAuth;
  RecyclerView recyclerView;
  List<ModelChatlist> chatlistList;
  List<ModelUser> userList;
  DatabaseReference reference;
  FirebaseUser currentUser;
  AdapterChatlist adapterChatlist;

  public ChatListFragment(){
      //required empty
  }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      View view = inflater.inflate(R.layout.fragment_chat_list, container, false);

      firebaseAuth = FirebaseAuth.getInstance();
      currentUser = FirebaseAuth.getInstance().getCurrentUser();

      recyclerView = view.findViewById(R.id.recyclerView);

      chatlistList = new ArrayList<>();

      reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(currentUser.getUid());
      reference.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              chatlistList.clear();
              for (DataSnapshot ds: dataSnapshot.getChildren()) {
                  ModelChatlist chatlist = ds.getValue(ModelChatlist.class);
                  chatlistList.add(chatlist);
              }
              loadChats();
          }

          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {

          }
      });

        return view;
    }

    private void loadChats() {
      userList = new ArrayList<>();
      reference = FirebaseDatabase.getInstance().getReference("Users");
      reference.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              userList.clear();
              for (DataSnapshot ds: dataSnapshot.getChildren()) {
                  ModelUser user = ds.getValue(ModelUser.class);
                  for (ModelChatlist chatlist: chatlistList){
                      if (user.getUid() != null && user.getUid().equals(chatlist.getId())) {
                          userList.add(user);
                          break;
                      }
                  }
                  adapterChatlist = new AdapterChatlist(getContext(), userList);
                  recyclerView.setAdapter(adapterChatlist);
                  for (int i=0; i<userList.size(); i++ ) {
                      lastMessage(userList.get(i).getUid());
                  }
              }
          }

          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {

          }
      });
    }

    private void lastMessage(String userId) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chats");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String theLastMessage = "default";
                for (DataSnapshot ds: dataSnapshot.getChildren()) {
                    ModelChat chat = ds.getValue(ModelChat.class);
                    if (chat==null) {
                        continue;
                    }
                    String sender = chat.getSender();
                    String receiver = chat.getReceiver();
                    if (sender == null || receiver == null) {
                        continue;
                    }
                    if (chat.getReceiver().equals(currentUser.getUid()) &&
                            chat.getSender().equals(userId) ||
                            chat.getReceiver().equals(userId) &&
                                    chat.getSender().equals(currentUser.getUid())){
                        theLastMessage = chat.getMessage();
                    }
                }
                adapterChatlist.setLastMessageMap(userId, theLastMessage);
                adapterChatlist.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

ModelChatList 的代码如下

public class ModelChatlist {
    String id;

    public ModelChatlist(String id) {
        this.id = id;
    }

    public ModelChatlist() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

我试图在 Firebase 中显示这些子节点的值,但由于错误而无法这样做。

标签: javaandroidfirebase-realtime-database

解决方案


执行 adatasnapshot.getValue(model class)时,需要确保键和模型参数名称完全相同。在你的情况下,ModelChatlistString id;. 所以你的快照需要有 key id。是否....getReference("Chatlist").child(currentUser.getUid());返回类似的东西id: "I am a string"?实际上,您的数据模型参数应该在快照中作为键值找到。您仍然可以使用快照中的一部分键创建对象,但名称必须完全匹配。


推荐阅读