2017-10-12 31 views
3

Ich benutze Firebase-Datenbank und haben Nachricht Objekt mit einem booleschen Feld geschrieben. Wenn ich versuche, das Objekt mit getValue(Boolean.class) zu lesen, erhalte ich eine Ausnahme. Es passiert nur, wenn ich diesen booleschen Wert bekomme, bekomme ich String ohne Probleme.Firebase-Datenbank NullPointerException bei Verwendung von getValue (Boolean.class)

Methode verursacht Ausnahme:

@Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     message.setSenderId(dataSnapshot.child("senderId").getValue(String.class)); 
     message.setDestinationId(dataSnapshot.child("destinationId").getValue(String.class)); 
     message.setDatetime(dataSnapshot.child("datetime").getValue(Date.class)); 
     message.setText(dataSnapshot.child("text").getValue(String.class)); 
     message.setSent(dataSnapshot.child("isSent").getValue(Boolean.class)); // this line causes NullPointerException 
} 

Meine Nachricht Modellklasse:

@IgnoreExtraProperties 
public class Message { 

    @Exclude 
    private String id; 
    @Exclude 
    private ValueEventListener valueListener; 
    @Exclude 
    private Conversation destination; 

    // User ID 
    private String senderId; 
    // Conversation ID 
    private String destinationId; 
    private Date datetime; 
    private String text; 
    private boolean isSent = false; 

    public Message(String id, String sender, String destination, Date date, String text) { 

     this.id = id; 
     this.senderId = sender; 
     this.destinationId = destination; 
     this.datetime = date; 
     this.text = text; 
    } 

    public Message() { 

    } 

    public Message(String id, Conversation destination) { 

     this.id = id; 
     this.destination = destination; 
    } 

// ... 

public boolean isSent() { 

     return isSent; 
    } 

    public void setSent(boolean sent) { 

     isSent = sent; 
    } 

} 

Beispiel der Meldung in der Datenbank gespeichert:

{ 
    "datetime" : { 
    "date" : 12, 
    "day" : 4, 
    "hours" : 17, 
    "minutes" : 32, 
    "month" : 9, 
    "seconds" : 25, 
    "time" : 1507822345776, 
    "timezoneOffset" : -120, 
    "year" : 117 
    }, 
    "destinationId" : "test_conversation", 
    "isSent" : true, 
    "senderId" : "test_sender", 
    "text" : "hello world" 
} 

Was ist falsch mit diesem Code? Ich habe versucht, es herauszufinden, aber ich habe immer noch nichts gefunden.

+0

nicht geschrieben Können Sie ein Beispiel für die Ausnahme von logcat teilen? Gibt es in Ihrer Datenbank einen Fall, in dem der 'isSent'-Wert nicht existiert (ist also' null')? – Grimthorr

+0

Bitte teilen Sie Ihre Protokolle, wo Sie die Ausnahme erhalten. – Sarfaraz

+0

bitte Screenshot Ihre Datenbankkonsole. Es ist möglich, dass das Feld 'isSent' nicht existiert – faruk

Antwort

1

Ich verwende boolean und nie ein Problem gewesen. Aber ich habe dasselbe Problem einmal erfahren, weil in der Datenbank mit Feld sent nicht isSent gespeichert wurde. Können Sie Ihre Datenbank von Ihrer Konsole aus screenShotShot?

Meine Lösung ist @PropertyName("isSent") vor Ihrem Getter und Setter

@PropertyName("isSent") 
public boolean isSent() { 

    return isSent; 
} 

@PropertyName("isSent") 
public void setSent(boolean sent) { 

    isSent = sent; 
} 

Ich fürchte, das Feld in Ihrer Datenbank zu setzen "sent" : true"isSent" : true

3

Versuchen Sie, isSent Variablentyp zu Boolean zu ändern.

Es hilft, wenn dataSnapshot.child("isSent").getValue(Boolean.class) null zurückgibt, Grund der Ausnahme in Aufruf Methode setSent(boolean) mit null verursachen.

0

Für mich sieht es so aus, als ob es einen Unterschied zwischen Boolean (das Primitive) und Boolean (die Klasse) gibt. Möchten Sie das beheben und es erneut versuchen? Ersetzen Sie alle primitiven Deklarationen in Ihrer Message Model-Klasse durch Boolean (die Klasse). Lassen Sie mich wissen, wie es geht.

0

Versuch ersetzt

public void setSent(boolean sent) { 

    isSent = sent; 
} 

mit

public void setSent(boolean sent) { 

    this.isSent = sent; 
} 
Verwandte Themen