我有一些功能齐全的代码行,可检索每个单个数据,但无法使用类来检索它们。例如:这些行运行正常。
double value = (double) ds.child("player1score").getValue();
long value = (long) ds.child("point").getValue();
但是,当使用类进行检索时,会发生错误。 这是我的代码的整个图片,不确定是否足以解决问题,随时让我知道还需要什么,非常感谢您的任何建议,谢谢!
Round()。class
public class Round {
public double player1score;
public double player2score;
public double player3score;
public double player4score;
public long point;
//Constructor
public Round(double player1score, double player2score, double player3score, double player4score, long point) {
this.player1score = player1score;
this.player2score = player2score;
this.player3score = player3score;
this.player4score = player4score;
this.point = point;
//Below are All the getter and setter etc
}
我的MainActivity.class.onCreate()
//Declare Variables
UserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameInfoRef = rootRef.child("user").child(UserId).child("gameInfo");
DatabaseReference gameRecordRef = rootRef.child("user").child(UserId).child("gameRecord");
String gameKey = "-LLyXhetqj9mj5fgh9bn";
在onCreate()下:
gameRecordRef.child(gameKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
ListView lv_history = (ListView) findViewById(R.id.lv_history);
ArrayList<Round> ResultList = new ArrayList<>();
//This line is where the error pointed to
Round round = (Round) ds.getValue(Round.class);
ResultList.add(round);
ivd_HistoryAdapter adapter = new ivd_HistoryAdapter(id_History.this, ResultList);
lv_history.setAdapter(adapter);
}
}
文本中的Firebase结构:
"user":
"5xGKRXeHgThQy70lduPEp3mosTj1":
"gameRecord":
"-LLyXhetqj9mj5fgh9bn":
"player1score": 0.5,
"player2score": 0.5,
"player3score": 0.5,
"player4score": 0.5,
"point": 5
Logcat错误:
com.google.firebase.database.DatabaseException:类viwil.mahjongcal.Round没有定义无参数的构造函数。如果您使用的是ProGuard,请确保未删除这些构造函数。 com.google.android.gms.internal.zzelx.zze(未知来源) 在com.google.android.gms.internal.zzelw.zzb(未知来源) 位于com.google.android.gms.internal.zzelw.zza(未知来源) 位于com.google.firebase.database.DataSnapshot.getValue(未知来源) 在viwil.mahjongcal.id_History $ 1.onDataChange(id_History.java:51) 在com.google.android.gms.internal.zzegf.zza(未知来源) com.google.android.gms.internal.zzeia.zzbyc(未知来源) com.google.android.gms.internal.zzeig.run(未知来源) 在android.os.Handler.handleCallback(Handler.java:761) 在android.os.Handler.dispatchMessage(Handler.java:98) 在android.os.Looper.loop(Looper.java:156) 在android.app.ActivityThread.main(ActivityThread.java:6523) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:942) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
错误指向这一行:(id_History.java:51)
Round round = ds.getValue(Round.class);
Firebase屏幕截图:
答案 0 :(得分:2)
您遇到以下错误:
FATAL EXCEPTION: ... does not define a no-argument constructor
因为您的Round
类未定义no-argument constructor
。
要在模型类中出现的JavaBeans require a no-argument constructor。
在Java中,当一个类根本没有构造函数时,Java编译器会自动添加一个默认的no-argument constructor
。在类中定义 any 构造函数后,默认的无参数构造函数就会消失。
在您的代码中,您的Round
类定义了一个包含五个参数的构造函数:
public Round(double player1score, double player2score, double player3score, double player4score, long point) {}
只要此构造函数存在并且您没有定义no-argument constructor
,该类就不会有一个。
要解决此问题,您可以从类中删除该构造函数,或者如下所示手动添加no-argument constructor
:
public Round() {}
当Firebase Realtime数据库SDK反序列化来自数据库的对象时,它要求所有正在使用的对象都具有此构造函数,以便它可以实例化该对象。通过使用公共设置方法或直接访问公共成员来设置对象中的字段。
您的Round
类没有公开的no-arg constructor
,因此SDK并不真正知道如何创建其实例。因此必须拥有它。
还请注意,不需要使用setter和getter。设置器始终是可选的,因为如果没有JSON属性的设置器,Firebase客户端将直接在字段上设置值。也不需要带参数的构造函数。两者都是惯用的,在没有它们的情况下有很好的案例。如果您将这些字段设为公开,则吸气剂也是可选的。