2017-04-20 3 views
0

Im derzeit Firebase zu speichern alle meine Informationen, ich habe eine Benutzerregistrierung mit der Firebase-Authentifizierung und erweiterte diesen Benutzer auf die Datenbank wiederverwenden die ID in der Authentifizierung erstellt, jetzt muss ich alle Benutzer zu erhalten und zu vergleichen seine Telefone mit einem Telefon mit dem Benutzer eingesetzt und retrive, dass bestimmte Benutzer, wenn die Zahl Spiel dies tat ich so:Datensnapshot schlägt fehl Casting

-Code

FirebaseDatabase.getInstance().getReference().child("Users") 
       .addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
          Log.d("snapshot", String.valueOf(snapshot)); 
          Log.d("snap",String.valueOf(snapshot.getValue(User.class))); 
          User user = snapshot.getValue(User.class); 
          if(number.equals(String.valueOf(user.getPhone()))){ 
           userFriend = user; 
          } 

         } 

         if(userFriend == null){ 
          //to do snackbar 
         } 
        } 

Benutzerklasse

public class User { 

    private String id; 
    private String username; 
    private int age = -1; 
    private String phone; 
    private int gamesPlayed = 0; 
    private ArrayList<User> friends = new ArrayList<User>(); 

    // CONSTRUCTOR 
    public User() { 

    } 

    public User(String username) { 
     this.username = username; 
    } 

    // GETTERS & SETTERS 
    public String getUsername() { return username; } 
    public void setUsername(String username) { this.username = username; } 

    public User(String id, String username, int age, String phone, int gamesPlayed, ArrayList<User> users) { 
     this.id = id; 
     this.username = username; 
     this.age = age; 
     this.phone = phone; 
     this.gamesPlayed = gamesPlayed; 
     this.friends = users; 
    } 

    public int getAge() { return age; } 
    public void setAge(int age) { this.age = age; } 

Mein DB-Struktur:

1

Und hier ist, was ich auf dem Stacktrace erhalten:

04-20 16:06:04.070 30972-30972/com.esmad.pdm.friendlymanager E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.esmad.pdm.friendlymanager, PID: 30972 
    com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String 
     at com.google.android.gms.internal.zzbtg.zzaF(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
     at com.google.android.gms.internal.zzbtg$zza.zze(Unknown Source) 
     at com.google.android.gms.internal.zzbtg$zza.zzaH(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zze(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
     at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) 
     at com.esmad.pdm.friendlymanager.Friends$1.onDataChange(Friends.java:61) 
     at com.google.firebase.database.Query$1.onDataChange(Unknown Source) 
     at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
     at com.google.android.gms.internal.zzbqx.zzZS(Unknown Source) 
     at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 
     at android.os.Handler.handleCallback(Handler.java:751) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6119) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
     at com.android.internal.os.ZygoteInit.main 

(ZygoteInit.java:776)

der Fehler bezieht sich auf diese Linie: User user = snapshot.getValue(User.class);

Ich vermute, dass es etwas zu tun hat, wie ich mein Benutzermodell konstruiere und die Daten, die ich abrufen, etwas nicht kompatibel ist. Ich habe 2 int bei meinem Modell gamesPlayed und Alter, aber wenn ich den Benutzer an den Snapshot übergeben, weiß ich nicht, wie man 2 spezifische Werte, so dass ich sie übergeben kann, muss ich die Benutzerinstanz redifine? oder ist alles in Ordnung, bitte hilf mir verwirrt:/`

Antwort

0

In deiner Benutzerklasse muss dein Telefonfeld vom Typ Long sein.

+0

Warum kann es nicht vom Typ String sein? –

+0

Da Sie es nicht als String in Ihrer Datenbank speichern, wenn Sie es als String abrufen möchten, setzen Sie die Telefonnummern in Anführungszeichen in Ihrer Datenbank, wie "91351246". Ich empfehle dringend, sie als Zeichenketten zu speichern, damit Sie sie später formatieren können – wnieves19