Can';t将java.lang.String类型的对象转换为com.psb.farmersmarket.Model.User类型。如何解决此错误?

Can';t将java.lang.String类型的对象转换为com.psb.farmersmarket.Model.User类型。如何解决此错误?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我想在UsersFragment中获取除当前登录用户之外的所有用户。但是我面临着下面给出的错误还有java文件和Firebase数据库 错误 UserFragment.java 错误是 Can't convert object of type java.lang.String to type com.psb.farmersmarket.Model.User User.java 数据库文件 我非常努力地解决这个错误,但错误仍然是一样的 请帮助我解决此错误。您可以像这样从数据快照读取数据

我想在UsersFragment中获取除当前登录用户之外的所有用户。但是我面临着下面给出的错误还有java文件和Firebase数据库


错误


UserFragment.java

错误是

Can't convert object of type java.lang.String to type com.psb.farmersmarket.Model.User

User.java


数据库文件

我非常努力地解决这个错误,但错误仍然是一样的
请帮助我解决此错误。

您可以像这样从数据快照读取数据

 @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       String description= dataSnapshot.child("Description").getValue(String.class);
       // also pick the other and then create yours object
}
我认为用户ID可能造成了问题。所以包围

 User user = snapshot.getValue(User.class);

使用try-catch,查找创建问题的字段。还有一件事,最好在变量名之间不要有空格,例如
电话号码
因此它应该类似于
电话号码

您的代码将侦听器附加到
/Users/aSpecificUid
。因此,在您的
onDataChange
中,
dataSnapshot
将包含单个用户的数据。但是,您的代码随后会在
dataSnapshot.getChildren()
上循环,这意味着该循环中的每个
snapshot
都包含该用户的单个属性的数据(
Description
Phone No
,等等)。然后当您调用
snapshot.getValue(User.class)
时,您试图将一个简单的字符串/数值转换为一个完整的
User
对象,这是行不通的

解决方案是从
onDataChange
中删除
getChildren()
上的循环:

    final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    assert firebaseUser != null;
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            userList.clear();
            User user = dataSnapshot.getValue(User.class);
            assert user != null;
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getActivity(), databaseError.toString(), Toast.LENGTH_SHORT).show();
        }
    });
另外:考虑到连接侦听器的位置,不需要检查
if(!user.getUserID().equals(firebaseUser.getUid()){
复选框,因此我删除了它

展望未来,请始终考虑
DataSnapshot
是包含单个节点,还是可以包含多个节点。如果可以包含多个节点,则需要循环
getChildren()


更新:要显示“除当前登录的用户外的所有用户”,您需要读取所有用户的数据,然后在循环中跳过当前登录的用户

由于您已经在检查循环中的UID,因此应该将侦听器附加到正确的节点
/Users

final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
assert firebaseUser != null;
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        userList.clear();
        for(DataSnapshot snapshot: dataSnapshot.getChildren()){
            User user = snapshot.getValue(User.class);
            assert user != null;
            if(!user.getUserID().equals(firebaseUser.getUid())){
                userList.add(user);
            }
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Toast.makeText(getActivity(), databaseError.toString(), Toast.LENGTH_SHORT).show();
    }
});

问题是解析用户类的字符串响应。先生,我还将添加user.java文件。我还添加了user.java文件。现在请指出我的错误。先生…先生,我希望所有用户,但当前登录的用户除外,它们存储在我的数据库中。&因为使用您必须使用userAdapter for循环中的所有用户r回答只有一个用户获取。如果要获取所有用户,则应将侦听器附加到
/users
。您可以从读取操作中排除单个子节点,因此您必须在应用程序代码中跳过当前用户。因为您已经在代码中跳过了此操作,所以应该侦听数据库中的正确节点。我也将此添加到了我的答案中。现在生成了另一个错误。
if(!user.getUserID().equals(firebaseUser.getUid()){
此行生成空对象引用。听起来你的
用户
是空的,因此你的
DataSnapshot
实际上没有指向数据库中用户的数据。那么我将如何在
user
变量中获取所有用户的数据
{
  "Users" : {
    "77EOhwNHgPbDwSEz1mbHOclUy0o1" : {
      "Description" : "student",
      "Phone No" : "9876543210",
      "email" : "pratikbharad@xyz.com",
      "imageURL" : "default",
      "name" : "Pratik Bharad",
      "search" : "pratik bharad",
      "status" : "offline",
      "user id" : "77EOhwNHgPbDwSEz1mbHOclUy0o1"
    },
    "vjDg7Q9QtgQO0DGM83Dwynk5Caa2" : {
      "Description" : "student",
      "Phone No" : "9876543210",
      "email" : "pratikbharad213@xyz.com",
      "imageURL" : "default",
      "name" : "Pratik",
      "search" : "pratik",
      "status" : "offline",
      "user id" : "vjDg7Q9QtgQO0DGM83Dwynk5Caa2"
    }
  },
}

 @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       String description= dataSnapshot.child("Description").getValue(String.class);
       // also pick the other and then create yours object
}
 User user = snapshot.getValue(User.class);

    final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    assert firebaseUser != null;
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            userList.clear();
            User user = dataSnapshot.getValue(User.class);
            assert user != null;
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getActivity(), databaseError.toString(), Toast.LENGTH_SHORT).show();
        }
    });
final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
assert firebaseUser != null;
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        userList.clear();
        for(DataSnapshot snapshot: dataSnapshot.getChildren()){
            User user = snapshot.getValue(User.class);
            assert user != null;
            if(!user.getUserID().equals(firebaseUser.getUid())){
                userList.add(user);
            }
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Toast.makeText(getActivity(), databaseError.toString(), Toast.LENGTH_SHORT).show();
    }
});