java - DatabaseException - 无法将 java.lang.String 类型的对象转换为 com.appmaster.akash.messageplus.Results 类型

标签 java android firebase firebase-realtime-database

错误

FATAL EXCEPTION: main
 Process: com.appmaster.akash.messageplus, PID: 978
 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.appmaster.akash.messageplus.Results
     at com.google.android.gms.internal.zzear.zzb(Unknown Source)
     at com.google.android.gms.internal.zzear.zza(Unknown Source)
     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
     at com.appmaster.akash.messageplus.TakingQuizDone$1.onChildAdded(TakingQuizDone.java:65)
     at com.google.android.gms.internal.zzdri.zza(Unknown Source)
     at com.google.android.gms.internal.zzdwu.zzbvb(Unknown Source)
     at com.google.android.gms.internal.zzdxa.run(Unknown Source)
     at android.os.Handler.handleCallback(Handler.java:742)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:157)
     at android.app.ActivityThread.main(ActivityThread.java:5571)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

代码

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();
            }
        });
    }
}

数据库

enter image description here

结果.java

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 = 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

此外,您的 Results 类与 JSON 数据结构不匹配。这意味着当您调用 getValue(Results.class) 时,Firebase 无法自动将 JSON 的属性读取到 Results 对象中。相反,您必须自己进行转换。

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();
  }
})

关于java - DatabaseException - 无法将 java.lang.String 类型的对象转换为 com.appmaster.akash.messageplus.Results 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552687/

相关文章:

java - Gradle Kotlin DSL : subdirectory for javadoc in jar file

javascript - 使用 Cloud Functions Request/Express 创建新帐户

Java 8 Collections.sort - 简单的拼写错误

java - 使用通用参数使用 REST 服务

android - 在 Android 中录制电话

Java Selenium 和 Appium 不起作用无法启动 REST http 接口(interface)监听器

javascript - 时间戳不适用于 firebase-functions-test

android - 获取 Firebase 测试实验室中的可用设备列表

java - 对齐使用流程布局的两个面板上的组件

android - 在服务器端构建 android .apk?我需要设置什么?