我在分析调用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语句来进行正确的分析,但我不知道如何做到这一点。你能救我吗?
答案 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)
课程内。