2017-12-19 2 views
0

Ich habe ein Problem mit der Analyse von Datasnapshot, die ich aus dem Aufruf valueEventListener erhalten habe. Aus bestimmten Gründen entschied ich mich, es bei der Abfrage der Datenbank anstelle von childEventListener zu verwenden.Datentypen von Kindern von datasnapshot Firebase finden

Nun habe ich diese Klasse mit dem folgenden Konstruktor, wo datasnapshot Parameter die datasnapshot gibt ich von valueEventListener bekam:

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

Alles ist gut und gut, wenn ich für einen einzigen Trainer abfragen, funktioniert der Code perfekt . Das Problem ist, wenn ich versuche, eine Liste zu erhalten:

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

ein Fehler erzeugt, der mir sagt, dass ein Konvertierungsfehler aufgetreten:

FATAL AUSNAHME: Hauptprozess: worldontheotherside.wordpress.com. drvingapp, PID: 16835 com.google.firebase.database.DatabaseException: Kann Objekt konvertieren vom Typ java.lang.L bei com.google.android.gms.internal.zzekh.zzb (Unknown Source) bei com.google.android.gms.internal.zzekh.za (Unbekannte Quelle) a t com.google.firebase.database.DataSnapshot.getValue (Unbekannte Quelle) bei worldontheotherside.wordpress.com.drvingapp.Classes.Trainer. (Trainer.java:4 at worldontheotherside.wordpress.com.drvingapp.Classes.Trainers. (Trainers.java bei worldontheotherside.wordpress.com.drvingapp.TrainersActivity $ 1.onDataChange (Train bei com.google.android.gms.internal.zzeeq.zza (Unknown Source) bei com.google.android.gms.internal .zzegl.zzbwe (Unbekannte Quelle) bei com.google.android.gms.internal.zzegr.run (Unbekannte Quelle) bei android.os.Handler.handleCallback (Handler.java:751) bei android.os.Handler .dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:154) bei android.app.Activ ityThread.main (ActivityThread.java:6692) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468) bei com .android.internal.os.ZygoteInit.main (ZygoteInit.java:1358) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)

verfolgt ich das Problem, und folgerte Das Problem war, dass, als ich den Datensnapshot an die Trainers-Klasse (die Klasse, die mir eine Liste bekommt) übergeben habe, nahm ich jedes Datasnapshot-Kind, das in der ursprünglichen Menge war, und erneut an die Trainer-Klasse (die Klasse mit den Daten des einzelnen Trainers).

Hier wiederum gibt es eine for-Schleife, die die Kinder des datasnapshot übergeben, die in diesem Fall die tatsächlichen Werte für den einzelnen Trainer sind (der Benutzername, civilNo, etc ...), und diese können nicht sein in die Trainer-Klasse gecastet.

Was für ich frage:

Ich dachte, festzustellen, ob die Kinder des übergebenen datasnapshot sind andere datasnapshots oder die Ist-Werte, und dann wird eine if-Anweisung basierend auf, dass, um das zu tun korrekte Analyse, aber ich habe keine Ahnung, wie das geht. Kannst du mir helfen?

Antwort

0

Sie sollten verwenden:

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

innerhalb Ihrer public Trainers(DataSnapshot dataSnapshot) Klasse.

+1

Vielen Dank! Du hast mich gerettet. –

0

In Ihrem Trainer Klasse statt

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

tun können Sie etwas tun: (Da Sie bereits die Kinder vorher geholt haben)

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

Kommt auch auf Ihre Abfrage an. Was Sie zu Firebase abfragen. wenn Sie in einigen Fällen direkten Zugang zu Kindern haben und in manchen Fällen nur äußere Objekte. – ABDevelopers

Verwandte Themen