Firebase无法使用类检索数据

时间:2018-09-10 15:59:49

标签: java android firebase firebase-realtime-database

我有一些功能齐全的代码行,可检索每个单个数据,但无法使用类来检索它们。例如:这些行运行正常。

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屏幕截图:

enter image description here

1 个答案:

答案 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客户端将直接在字段上设置值。也不需要带参数的构造函数。两者都是惯用的,在没有它们的情况下有很好的案例。如果您将这些字段设为公开,则吸气剂也是可选的。