2016-11-02 3 views
0

Ich bin neu bei Firebase und versuche, die Echtzeitdatenbank zu implementieren Android. Ich kann an die DB erfolgreich schreiben, aber wenn ich versuche, von der DB zu lesen, bekomme ich com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.softworld.crib.models.Usercom.google.firebase.database.DatabaseException: Objekt vom Typ java.lang.String kann nicht in den Typ com.softworld.crib.models.User konvertiert werden.

Here is my DB on firebase

Dies ist, wie ich schreiben und lesen von der DB

DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("myUsers"); 
String userId = dbRef.push().getKey(); 

     User user = new User("My New Name","[email protected]",loggedInUser.getPersonPhoto()); 
//how I post to db 
     dbRef.child(userId).setValue(user); 
//how I read from db 
dbRef.child(userId).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       // This method is called once with the initial value and again 
       // whenever data at this location is updated. 
       List users = new ArrayList<>(); 

       for (DataSnapshot noteDataSnapshot : dataSnapshot.getChildren()) { 
        User user = noteDataSnapshot.getValue(User.class); 
        Toast.makeText(MainActivity.this, user.getPersonEmail(), Toast.LENGTH_LONG).show(); 
        users.add(user); 
       } 

       //Log.d(TAG, "Value is: " + value); 
      } 

      @Override 
      public void onCancelled(DatabaseError error) { 
       // Failed to read value 
       //Log.w(TAG, "Failed to read value.", error.toException()); 
      } 
     }); 

Und meine Benutzerklasse sieht aus wie dieses

public class User { 
    String personName,personEmail; 
    Uri personPhoto; 

    public User() { 
    } 

    public User(String personName, String personEmail, Uri personPhoto) { 
     this.personName = personName; 
     this.personEmail = personEmail; 
     this.personPhoto = personPhoto; 
    } 

    public String getPersonName() { 
     return personName; 
    } 

    public void setPersonName(String personName) { 
     this.personName = personName; 
    } 

    public String getPersonEmail() { 
     return personEmail; 
    } 

    public void setPersonEmail(String personEmail) { 
     this.personEmail = personEmail; 
    } 

    public Uri getPersonPhoto() { 
     return personPhoto; 
    } 

    public void setPersonPhoto(Uri personPhoto) { 
     this.personPhoto = personPhoto; 
    } 
} 

Antwort

2

ich denke, Sie sollten

ändern

zu

dbRef.addValueEventListener(new ValueEventListener() { 

als

Alternativ in https://www.firebase.com/docs/android/guide/retrieving-data.html erklärt, wenn Sie wirklich wollen, um nur ein Ereignis für diesen speziellen userId zu erhalten, die DataSnapshot Ihr immer ist wahrscheinlich bereits der Benutzer den Sie suchen , so .getChildren() in

for (DataSnapshot noteDataSnapshot : dataSnapshot.getChildren()) { 

verwendet, ist wahrscheinlich nicht notwendig.

+0

ich habe das geändert und der Konvertierungsfehler ist verschwunden. Allerdings bekomme ich jetzt java.lang.InstantiationException: Kann abstrakte Klasse nicht instantia.net.Uri –

+0

Wenn es nicht am selben Ort ist, ist es ein anderes Problem. Vielleicht sollten Sie dokumentieren, wie Sie eine Anwendung debuggen (Schritt-für-Schritt, Protokolle, Stacktracks lesen). –

+0

correct @ Orabîg Ich fand das Problem woanders. Aber Ihre Lösung beim Wechseln zu dbRef.addValueEventListener (new ValueEventListener() {löste mein Problem. –

Verwandte Themen