【问题标题】:Firebase unable to retrieve value to classFirebase 无法检索到类的值
【发布时间】:2019-02-14 23:55:51
【问题描述】:

我有一行代码可以检索每个数据,但未能将它们全部应用于一个类。这条线运行良好。

double value = (double) ds.child("player1score").getValue();

但是当涉及到这一点时,它会失败并崩溃。

int value = (int) ds.child("point").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 int point;

//Constructor
public Round(double player1score, double player2score, double player3score, double player4score, int 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);

                //It shows proper results in logcat
                System.out.println(ds.getValue());

                ArrayList<Round> ResultList = new ArrayList<>();

                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: Class viwil.mahjongcal.Round does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
    at com.google.android.gms.internal.zzelx.zze(Unknown Source)
    at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
    at viwil.mahjongcal.id_History$1.onDataChange(id_History.java:51)
    at com.google.android.gms.internal.zzegf.zza(Unknown Source)
    at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source)
    at com.google.android.gms.internal.zzeig.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:761)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

错误指向这一行:(id_History.java:51)

    Round round = ds.getValue(Round.class);

Firebase 截图:

【问题讨论】:

  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。没有它,我们就帮不上什么忙了。也请回复@。
  • @AlexMamo 用实际错误编辑了帖子,我不在我的电脑附近,所以我无法提供错误,抱歉,谢谢!

标签: android firebase firebase-realtime-database data-retrieval


【解决方案1】:

要解决这个问题,请更改以下代码行:

int value = (int) ds.child("point").getValue();

long score = ds.child("point").getValue(Long.class);

您需要将该对象转换为Long 类型的对象,而不是原始int。即使您在模型类中将score 属性定义为int,在数据库中该属性也存储为long。默认情况下,数字在 Firebase 实时数据库中存储为长数字,ints

【讨论】:

  • 适用于这条线!谢谢!但仍然无法为班级工作...我将编辑问题,此行遇到错误:Round round = ds.getValue(Round.class);
  • 很高兴听到它有效:) 但这听起来是一个新问题,应该被视为另一个问题,我无法在评论中回复或仅使用上述数据。作为个人猜测,我认为 for 循环有问题,但为了遵守这个社区的规则,请使用 MCVE 发布另一个新问题,以便我和其他用户可以帮助你。
  • 当您发布其他问题时,您可以将链接提供给我。干杯!
  • 没问题!我创建了一个新的,希望它符合 MCVE,请随时留下任何改进建议,谢谢! stackoverflow.com/questions/52261576/…
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多