0

I am trying to retrieve data from the Firebase Realtime Database and I want to display them on the screen in a TextView, but I'm facing whit this error:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.chocolate.ModelChatlist
            at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
            at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
            at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
            at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
            at com.example.chocolate.ChatListFragment$1.onDataChange(ChatListFragment.java:67)
            at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
            at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
            at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
            at android.os.Handler.handleCallback(Handler.java:938)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:233)
            at android.app.ActivityThread.main(ActivityThread.java:8010)
            at java.lang.reflect.Method.invoke(Native Method)

The code of ChatListFragment class is given below:

import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SearchView;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

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) {

            }
        });
    }

    private void checkUserStatus(){

      FirebaseUser user = firebaseAuth.getCurrentUser();
      if (user != null) {

      }
      else {
          startActivity(new Intent(getActivity(), MainActivity.class));
          getActivity().finish();
      }
    }
}

The code for ModelChatList is given below:

package com.example.chocolate;

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;
    }
}

database Database

I am trying to display the value of this child node in the Firebase but I am unable to do so because of this error.

6
  • The error is straight forward, there is an error converting the string received by ds.getValue(ModelChatlist.class) around line 67. Here you're trying to assign a String to a ModelChatlist variable. You may want to create a ModelChatlist object, by a parametrized constructor (i.e. ModelChatlist(String s)) Commented Oct 9, 2021 at 11:04
  • already created in modelchatlist @CcmU Commented Oct 9, 2021 at 11:06
  • So ds.getValue does provide the id value, correct? Commented Oct 9, 2021 at 11:12
  • Have you considered reading the rest of the message? The part reading 'to type com.example.chocolate.ModelChatlist'? Commented Oct 9, 2021 at 11:21
  • no only consider there id's @user207421 Commented Oct 9, 2021 at 12:32

2 Answers 2

2

You are getting the following error:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.chocolate.ModelChatlist

Because you are trying to convert an object of type String to an object of type ModelChatlist, which is actually not possible in Java. This is happening because you are looping through the DataSnapshot object using the getChildren() method. All children within the UID node, are String elements and not ModelChatlist objects, hence that error.

To solve this, you have to remove the loop:

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

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
          Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
      }
  });
Sign up to request clarification or add additional context in comments.

Comments

0

As I said in the comments, the error occurs when trying to convert the string received by ds.getValue(ModelChatlist.class) into a ModelChatlist variable. Since, I assume, ds.getValue() provides the id value of a ModelChatlist, you'd want to do something like:

for (DataSnapshot ds: dataSnapshot.getChildren()) {
    ModelChatlist chatlist = new ModelChatlist (ds.getValue(ModelChatlist.class));
    chatlistList.add(chatlist);
}

1 Comment

after using this same error @CcmU

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.