我在分析调用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语句来进行正确的分析,但我不知道如何做到这一点。你能帮助我吗?
你应该使用:
for(DataSnapshot snapshot: dataSnapshot.getChildren())
trainers.add(snapshot.getValue(Trainer.class);
}
在你的public Trainers(DataSnapshot dataSnapshot)
课程内。
在你的教练班而不是做
for(DataSnapshot snapshot: dataSnapshot.getChildren())
{
Trainer trainer = snapshot.getValue(Trainer.class);
}
你可以这样做:(因为你之前已经抓过孩子)
for(DataSnapshot snapshot: dataSnapshot)
{
Trainer trainer = snapshot.getValue(Trainer.class);
}