2017-12-19 12 views
0

valueEventListenerを呼び出すことから得たdatasnapshotの解析に問題があります。 データベースを照会するときに、特定の理由でchildEventListenerの代わりに使用することを選択しました。 、コードは完璧に動作し、私は1人のトレーナーを照会するときdatasnapshot firebaseの子供のデータ型を見つけよう

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(); 
    } 
} 

すべてが順調と良いです:

は今、私はdatasnapshotパラメータは、私がvalueEventListenerからもらったdatasnapshotを渡す次のコンストラクタを使用して、このクラスを持っています。

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(不明な情報源)に変換できません at com.google.android.gms.internal.zzekh.zza(不明な情報源) a t com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at otherside.wordpress.com.drvingapp.Classes.Trainer(Trainer.java:4 at worldontheotherside.wordpress.com.drvingapp.Classes.Trainers。 (Trainers.java at worldsideheotherside.wordpress.com.drvingapp.TrainersActivity $ 1.onDataChange(列車 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.Activ ityThread.main(ActivityThread.java:6692) at java.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468) at com .android.internal.os.ZygoteInit.main com.android.internal.os.ZygoteInit.mainで(ZygoteInit.java:1358) (ZygoteInit.java:1358)

私はこの問題を追跡、および結論その問題は、私がTrainerクラス(私にリストを取得するクラス)にdatasnapshotを渡したとき、私は元のセットにあった各datasnapshotの子を取って、もう一度それをTrainerクラスに渡したからです単一のトレーナーのデータと一緒に)。

ここでは、渡されたdatasnapshotの子を取得するforループがあります。この場合、単一のトレーナー(username、civilNoなど)の実際の値です。トレーナークラスにキャストされました。

私が求めている何

:私は渡されたdatasnapshotの子供が他のdatasnapshotsまたは実際の値であるかどうかを決定すると考え、そして実行するために、それに基づいて、if文を使用し

正確な分析ができましたが、どうすればいいのかわかりません。手伝って頂けますか?あなたのトレーナークラスで

答えて

0

for(DataSnapshot snapshot: dataSnapshot.getChildren()) 
      trainers.add(snapshot.getValue(Trainer.class); 
    } 
public Trainers(DataSnapshot dataSnapshot)クラス内の

+1

ありがとう!あなたは私を救いました。 –

0

代わりの

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

をやってあなたのような何かを行うことができます:(すでに以前に子供をフェッチしているので)

あなたが使用する必要があります
for(DataSnapshot snapshot: dataSnapshot) 
    { 
     Trainer trainer = snapshot.getValue(Trainer.class); 
    } 
+0

また、クエリによって異なります。あなたがfirebaseに照会しているもの。場合によっては子どもに直接的にアクセスしている場合や、場合によっては外側のオブジェクトにアクセスする場合もあります。 – ABDevelopers

関連する問題