Can';t将java.lang.String类型的对象转换为com.psb.farmersmarket.Model.User类型。如何解决此错误?
我想在UsersFragment中获取除当前登录用户之外的所有用户。但是我面临着下面给出的错误还有java文件和Firebase数据库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 数据库文件 我非常努力地解决这个错误,但错误仍然是一样的 请帮助我解决此错误。您可以像这样从数据快照读取数据
错误
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();
}
});