![](/img/trans.png)
[英]com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.chocolate.ModelChatlist
[英]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()
提供了ModelChatlist
的id
值,你会想要做这样的事情:
for (DataSnapshot ds: dataSnapshot.getChildren()) {
ModelChatlist chatlist = new ModelChatlist (ds.getValue(ModelChatlist.class));
chatlistList.add(chatlist);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.