java - com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.example.chocolate.ModelChatlist 类型
问题描述
我正在尝试从 Firebase 实时数据库中检索数据,并希望在 TextView 的屏幕上显示它们,但遇到错误。
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 中显示这些子节点的值,但由于错误而无法这样做。
解决方案
执行 adatasnapshot.getValue(model class)
时,需要确保键和模型参数名称完全相同。在你的情况下,ModelChatlist
有String id;
. 所以你的快照需要有 key id
。是否....getReference("Chatlist").child(currentUser.getUid());
返回类似的东西id: "I am a string"
?实际上,您的数据模型参数应该在快照中作为键值找到。您仍然可以使用快照中的一部分键创建对象,但名称必须完全匹配。
推荐阅读
- amazon-web-services - 使用 cloudformation yaml 在路由表子网关联中关联多个子网
- python - 朴素贝叶斯在 python 中从头开始,结果“进程以退出代码 0 完成”
- python - ForeignKeys 和历史数据
- r - 用两位数在R中生成数字序列
- javascript - 记住前一个 i 的 for 循环
- ruby-on-rails - 导航到上一页时,Select2 多次渲染
- angularjs - 未捕获的错误:AngularJS 中的 [$injector:unpr]
- node.js - Inoic 4+ Web App 中的 Firebase 安装错误
- c++ - 清单申报差异
- ios - 如何在 react-native-WKWebView 中使用道具 allowInlineMediaPlayback?