查找datasnapshot firebase子项的数据类型

问题描述 投票:0回答:2

我在分析调用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:无法在com.google.android.gms.internal转换java.lang.L类型的对象。来自worldontheotherside.wordpress.com.drvingapp的com.google.firebase.database.DataSnapshot.getValue(未知来源)com.google.android.gms.internal.zzekh.zza(未知来源)的zzekh.zzb(未知来源)。 Classes.Trainer。(Trainer.java:4 at worldontheotherside.wordpress.com.drvingapp.Classes.Trainers。(Trainer.java at worldontheotherside.wordpress.com.drvingapp.TrainersActivity $ 1.onDataChange(在com.google.android.gms上训练) .internal.zzeeq.zza(未知来源)com.google.android.gms.internal.zzegl.zzbwe(未知来源)位于android.os上的com.google.android.gms.internal.zzegr.run(未知来源) .Handler.handleCallback(Handler.java:751)位于android.app.AtoT.Thread.main的android.os.Handler.dispatchMessage(Handler.java:95)android.os.Looper.loop(Looper.java:154) ActivityThread.j ava:6692)位于com.android.internal.os.ZygoteInit的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)的java.lang.reflect.Method.invoke(Native Method)。 main(ZygoteInit.java:1358)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

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

在这里,反过来有一个for循环,它获取传递的数据快照的子节点,在这种情况下是单个训练器的实际值(用户名,civilNo等等),并且那些不能被传递给Trainer类。

我要求的是:

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

android firebase firebase-realtime-database
2个回答
0
投票

你应该使用:

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

在你的public Trainers(DataSnapshot dataSnapshot)课程内。


0
投票

在你的教练班而不是做

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

你可以这样做:(因为你之前已经抓过孩子)

 for(DataSnapshot snapshot: dataSnapshot)
   {
        Trainer trainer = snapshot.getValue(Trainer.class);
   }
© www.soinside.com 2019 - 2024. All rights reserved.