繁体   English   中英

如何解决此错误:com.google.firebase.database.DatabaseException:无法转换 java.lang.String 类型的 object

[英]how to solve this error: com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String

我正在尝试从 Firebase 实时数据库中检索数据,我想将它们显示在TextView的屏幕上,但我遇到了这个错误:

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)

ChatListFragment class的代码如下:

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

ModelChatList的代码如下:

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

数据库数据库

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

您收到以下错误:

com.google.firebase.database.DatabaseException:无法将类型 java.lang.String 的 object 转换为类型 com.example.chocolate.ModelChatlist

因为您正在尝试将 String 类型的 object 转换为ModelChatlist类型的 object,这在 Java 中实际上是不可能的。发生这种情况是因为您正在使用getChildren()方法循环访问 DataSnapshot object。 UID 节点中的所有子节点都是 String 元素而不是ModelChatlist对象,因此会出现该错误。

要解决这个问题,您必须删除循环:

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

正如我在评论中所说,错误发生在尝试将ds.getValue(ModelChatlist.class)接收到的字符串转换为ModelChatlist变量时。 因为,我假设, ds.getValue()提供了ModelChatlistid值,你会想要做这样的事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM