查找datasnapshot firebase

时间:2017-12-19 05:27:43

标签: android firebase firebase-realtime-database

我在分析调用valueEventListener时获得的数据快照时遇到问题。 出于某些原因,我在查询数据库时选择使用它而不是childEventListener

现在,我的这个类有以下构造函数,其中datasnapshot参数传递了我从valueEventListener得到的数据快照:

public Trainer(DataSnapshot dataSnapshot)
{
    for(DataSnapshot snapshot: dataSnapshot.getChildren())
    {
        Trainer trainer = snapshot.getValue(Trainer.class);

        name = trainer.name;
        civilNo = trainer.civilNo;
        email = trainer.email;
        age = trainer.age;
        phone = trainer.phone;
        gender = trainer.gender;
        password = trainer.password;
        carNo = trainer.carNo;
        places = trainer.places;
        vehicleType = trainer.vehicleType;
        languages = trainer.languages;
        rate = trainer.rate;
        price = trainer.price;
        contractType = trainer.contractType;
        spokenLanguage = trainer.spokenLanguage;
        trainingAreas=trainer.trainingAreas;
        hourPrice=trainer.hourPrice;
        contractPrice=trainer.contractPrice;
        trainingTime=trainer.trainingTime;
        key = snapshot.getRef().getKey();
    }
}

当我查询一个单一的培训师时,一切都很好,代码完美无缺。问题是当我试图获得一个列表时:

public class Trainers {

    private ArrayList<Trainer> trainers;

    public Trainers()
    {
        // Empty default constructor
    }

    public Trainers(DataSnapshot dataSnapshot)
    {
        trainers = new ArrayList<>();

        for(DataSnapshot snapshot: dataSnapshot.getChildren())
            trainers.add(new Trainer(snapshot));
    }

    public ArrayList<Trainer> getTrainers() {
        return trainers;
    }

    public void setTrainers(ArrayList<Trainer> trainers) {
        this.trainers = trainers;
    }
}

生成错误,告诉我发生了转换错误:

  

致命例外:主要流程:   worldontheotherside.wordpress.com.drvingapp,PID:16835   com.google.firebase.database.DatabaseException:无法转换对象   类型java.lang.L       在com.google.android.gms.internal.zzekh.zzb(未知来源)       在com.google.android.gms.internal.zzekh.zza(未知来源)       在com.google.firebase.database.DataSnapshot.getValue(未知来源)       在worldontheotherside.wordpress.com.drvingapp.Classes.Trainer。(Trainer.java:4       在worldontheotherside.wordpress.com.drvingapp.Classes.Trainers。(Trainers.java       at worldontheotherside.wordpress.com.drvingapp.TrainersActivity $ 1.onDataChange(Train       在com.google.android.gms.internal.zzeeq.zza(未知来源)       在com.google.android.gms.internal.zzegl.zzbwe(未知来源)       在com.google.android.gms.internal.zzegr.run(未知来源)       在android.os.Handler.handleCallback(Handler.java:751)       在android.os.Handler.dispatchMessage(Handler.java:95)       在android.os.Looper.loop(Looper.java:154)       在android.app.ActivityThread.main(ActivityThread.java:6692)       at java.lang.reflect.Method.invoke(Native Method)       在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

我追踪了问题,并得出结论,问题是因为当我将数据快照传递给Trainers类(获取列表的类)时,我将每个数据快照子项放在我得到的原始集合中,并且再次将它传递给Trainer课程(带有单一培训师数据的课程)。

在这里,反过来有一个for循环,它可以传递数据快照的子节点,在这种情况下,单个训练器的实际值(用户名,CivilNo等等),以及那些不能被传输的到培训班。

我要求的是:

我想到确定传递的数据快照的子节点是否是其他数据快照或实际值,然后使用基于它的if语句来进行正确的分析,但我不知道如何做到这一点。你能救我吗?

2 个答案:

答案 0 :(得分:0)

在训练师课程中而不是

 for(DataSnapshot snapshot: dataSnapshot.getChildren())
    {
        Trainer trainer = snapshot.getValue(Trainer.class);
    }

您可以执行以下操作:(因为您之前已经抓过孩子)

 for(DataSnapshot snapshot: dataSnapshot)
   {
        Trainer trainer = snapshot.getValue(Trainer.class);
   }

答案 1 :(得分:0)

您应该使用:

for(DataSnapshot snapshot: dataSnapshot.getChildren())
            trainers.add(snapshot.getValue(Trainer.class);
    }

public Trainers(DataSnapshot dataSnapshot)课程内。