【问题标题】:Firebase retrieve data from 2 levels in Firebase Realtime DatabaseFirebase 从 Firebase 实时数据库中的 2 个级别检索数据
【发布时间】:2021-04-12 10:01:50
【问题描述】:

我正在尝试将 Firebase 实时数据库中的数据检索到名为“joueur”的表中,但出现以下错误:

com.google.firebase.database.DatabaseException: E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.example.florian.fichiertexteandbddtest1,PID:899 com.google.firebase.database.DatabaseException:无法将 java.util.ArrayList 类型的对象转换为 com.example.florian.fichiertexteandbddtest1.Joueur 类型的对象

我的 Firebase 实时数据库是这个:firebase realtime database

我试图在表 Joueurs 的子项中获取 joueurs 的值

这是我检索数据并将其添加到表中的代码:

int i;
            for (i=0;i<150;i++) {
                firebaseReference2.child(String.valueOf(i));
                firebaseReference2.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        List<String> keys = new ArrayList<>();
                        for (DataSnapshot keyNode : snapshot.getChildren()) {
                            keys.add(keyNode.getKey());
                            Joueur joueur = keyNode.getValue(Joueur.class);
                            databaseHelper.addJoueur(joueur.getNom_joueur(), joueur.getPrenom_joueur(), joueur.getNum_licence_joueur(), joueur.getId_equipe_joueur());
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        Toast.makeText(EquipeActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
            }

错误在 Joueur joueur = keyNode.getValue(Joueur.class);

还有我的 Joueur 课程: `public class Joueur 实现 Serializable {

private String nom_joueur;
private String prenom_joueur;
private int num_licence_joueur;
private int id_equipe_joueur;
private int id;


public Joueur() {
}

public Joueur(String nom_joueur, String prenom_joueur, int num_licence_joueur, int id_equipe_joueur, int id) {
    this.nom_joueur = nom_joueur;
    this.prenom_joueur = prenom_joueur;
    this.num_licence_joueur = num_licence_joueur;
    this.id_equipe_joueur = id_equipe_joueur;
    this.id = id;
}

public String getNom_joueur() {
    return nom_joueur;
}

public void setNom_joueur(String nom_joueur) {
    this.nom_joueur = nom_joueur;
}

public String getPrenom_joueur() {
    return prenom_joueur;
}

public void setPrenom_joueur(String prenom_joueur) {
    this.prenom_joueur = prenom_joueur;
}

public int getNum_licence_joueur() {
    return num_licence_joueur;
}

public void setNum_licence_joueur(int num_licence_joueur) {
    this.num_licence_joueur = num_licence_joueur;
}

public int getId_equipe_joueur() {
    return id_equipe_joueur;
}

public void setId_equipe_joueur(int id_equipe_joueur) {
    this.id_equipe_joueur = id_equipe_joueur;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}`

谢谢!

【问题讨论】:

  • 你的“firebaseReference2”对象是如何定义的?
  • 我是这样定义的:firebaseReference2 = firebaseDatabase.getReference().child("Joueurs");所以它会从 Joueurs 表中读取数据
  • 而且你想获取Joueurs节点下存在的数据以及所有子节点,对吧?
  • 只从子节点,我只想获取创建播放器需要的数据,所以id_equipe_joueur, nom_joueur, prenom_joueur, num_licence_joueur
  • 好的,我马上给你写答案。

标签: java android firebase firebase-realtime-database


【解决方案1】:

为了能够根据您的数据库架构获取数据,您需要使用“.getChildren()”两次遍历“DataSnapshot”对象,如以下代码行所述:

firebaseReference2.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            List<String> keys = new ArrayList<>();
            for (DataSnapshot firstLevelSnapshot : task.getResult().getChildren()) {
                for (DataSnapshot secondLevelSnapshot : firstLevelSnapshot.getChildren()) {
                    String key = secondLevelSnapshot.getKey();
                    keys.add(key);
                    Joueur joueur = secondLevelSnapshot.getValue(Joueur.class);
                    databaseHelper.addJoueur(
                        joueur.getNom_joueur(),
                        joueur.getPrenom_joueur(),
                        joueur.getNum_licence_joueur(),
                        joueur.getId_equipe_joueur()
                    );
                    Log.d(TAG, secondLevelSnapshot.getNom_joueur());
                }
            }
        } else {
            Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

上述代码的结果是将每个“Joueur”对象传递给“addJoueur()”方法,在 logcat 中您将看到以下输出:

ccu
...

【讨论】:

  • 非常感谢!我想过做同样的事情,但不知道方法 addOnCompleteListener :'(
  • 它起初工作但现在我有错误:com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to int 并指向行 Joueur joueur = secondLevelSnapshot.getValue(Joueur.Class)
  • Joeuurs 类的所有参数都必须是字符串吗?
  • 您遇到另一个错误的事实意味着最初的错误消失了,这是个好消息 :) 但这听起来像是一个新问题,基本上应该被视为另一个问题,因为它无法在一条评论。作为个人猜测,很可能您在数据库中有一个包含 String 的属性,并且您正在尝试将其转换为 int,这在 Java 中是不可能的,但是为了遵循这个社区的规则,请发布一个新问题使用自己的MCVE,因此我和其他 Firebase 开发人员可以帮助您。
  • Joeuurs 类的所有参数都必须是字符串吗? 不,每个参数都应该是您需要的类型。
猜你喜欢
  • 2019-04-16
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多