数据库异常-Can';t将java.lang.String类型的对象转换为com.appmaster.akash.messageplus.Results类型
错误 代码 数据库 Results.java数据库异常-Can';t将java.lang.String类型的对象转换为com.appmaster.akash.messageplus.Results类型,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,错误 代码 数据库 Results.java private void fetchResults() { mDatabaseReference.child("Users").child(id).child("Quiz").child("Results").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataS
private void fetchResults() {
mDatabaseReference.child("Users").child(id).child("Quiz").child("Results").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Results results = dataSnapshot.getValue(Results.class);
resultsList.add(results);
mAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
}
}
错误在数据库中,名称和值都未修复。喜欢它是根据用户决定的
保存数据
public class Results {
private String Name;
private String Score;
public Results() {
}
public Results(String Name, String Score) {
this.Name = Name;
this.Score = Score;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getScore() {
return Score;
}
public void setScore(String score) {
Score = score;
}
String name=receiversname;
HashMap userMap=新的HashMap();
userMap.put(name,String.valueOf(mScore));
mRef.child(“用户”).child(receiversid).child(“测验”).child(“结果”).setValue(userMap).addOnCompleteListener(新OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
意向意向=新意向(takingquick.this,TakingQuizDone.class);
intent.putExtra(“receiversid”,receiversid);
intent.putExtra(“Score”,mScore.toString());
星触觉(意向);
完成();
}
}
});
查看您的数据库结构,在结果
节点下(如果我理解正确的话)似乎有一个节点,其名称对应于用户名,该节点的值对应于分数
关于您的结果.java
类,您的数据库应按如下方式组织数据:
String name = RecieversName;
HashMap<String, String> userMap = new HashMap<>();
userMap.put(name, String.valueOf(mScore));
mRef.child("Users").child(RecieversId).child("Quiz").child("Results").setValue(userMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Intent intent = new Intent(TakingQuiz.this, TakingQuizDone.class);
intent.putExtra("RecieversId",RecieversId);
intent.putExtra("Score", mScore.toString());
startActivity(intent);
finish();
}
}
});
看起来您希望一次性处理
../results
下的所有结果。在这种情况下,您应该使用ValueEventListener
而不是ChildEventListener
此外,您的结果
类与JSON数据结构不匹配。这意味着调用getValue(Results.class)
时,Firebase无法将JSON的属性自动读入Results
对象。相反,你必须自己进行转换
-Quiz
-Question1
-.......
-Results
-Name: "Akash"
-Score: "5"
您的问题中包含了一个指向JSON树图片的链接。请将其替换为实际的JSON文本,您可以通过单击中的导出JSON链接轻松获取。将JSON作为文本使其可搜索,允许我们轻松使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。那么它将如何填充recyclerview?我不确定您的意思。您有一个适配器,然后在更改该适配器的数据集时调用
mAdapter.notifyDataSetChanged()
(我假设resultsList
是)。我的适配器是否与数据库匹配。。。比如说这是正确的吗?我能不能用Akash:5来代替Akash分数5?是的,你可以,但是你必须遵循Frank在另一个答案中的建议。并停止使用结果类。
-Quiz
-Question1
-.......
-Results
-Name: "Akash"
-Score: "5"
mDatabaseReference.child("Users").child(id).child("Quiz/Results").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot resultSnapshot: dataSnapshot.getChildren()) {
String user = resultSnapshot.getKey();
String score = resultSnapshot.getValue(String.class);
Results results = new Results(user, score);
resultsList.add(results);
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
})