Reputation: 2768
I'm using Google's firebase-database SDK for Android, v9.0.1. I have my app hooked up to Firebase and can read and write data at various locations.
However, I cannot get a specific boolean field to bind using dataSnapshot.getValue(PingReport.class)
and I keep getting an error in my logs that says No setter/field for isUp found on class com.myapp.PingReport
when the field clearly exists in my model.
Here's the JSON in the Firebase database:
{
"durationMs": 364,
"isUp": true,
"timestampMillis": 1464916019971
}
and here's the model class:
public class PingReport {
private long durationMs;
private boolean isUp;
private long timestampMillis;
public PingReport() {
// required by Firebase
}
public PingReport(long durationMs, boolean isUp, long timestampMillis) {
this.durationMs = durationMs;
this.isUp = isUp;
this.timestampMillis = timestampMillis;
}
public long getDurationMs() {
return durationMs;
}
public boolean isUp() {
return isUp;
}
public long getTimestampMillis() {
return timestampMillis;
}
}
If I call getDurationMs()
or getTimestampMillis()
the correct values are returned, but the value returned from isUp()
is always false
. I have tried different combinations of naming it up
and isUp
and mUp
and adding setters setUp(boolean up)
and setIsUp(boolean isUp)
, but nothing seems to work. The documentation for the Android SDK not very detailed. Is there some trick or detail I'm overlooking?
Upvotes: 10
Views: 11473
Reputation: 1322
if you are using Kotlin then use PropertyName on getter and setter of the variable so that you bypass kotlin generated getters/setters names. using this annotation on the variable itself doesn't help because it doesnt affect the generated setters and setters.
data class(
@get:PropertyName("isRead")
@set:PropertyName("isRead")
var isRead: Boolean? = null
)
you can check this question for more info about java
Upvotes: 0
Reputation: 14626
Don't use "is" with your variable name specifically with Firebase Realtime Database. I also had the same problem, I have to change my variable name from "isUserExist" to "userExist" ! Crippy Firebase!
Upvotes: 2
Reputation: 2575
I ran into this problem in Kotlin. I had several boolean values. All of them were set properly except for the one that started with is
. To fix this, I made it a custom getter and that fixed the problem:
data class FirebaseEvent(
val description: String? = null,
val disableLogin: Boolean? = null,
val isDVR: Boolean? = null
) {
fun getIsDVR(): Boolean? {
// this is needed to trick Kotlin into using this getter instead of generating its own which breaks firebase
return isDVR
}
}
Upvotes: 4
Reputation: 399
Alternatively, you can use the @PropertyName annotation from Firebase Database to handle this. Also, it's better to include setters as well.
Pass a custom Java object, if the class that defines it has a default constructor that takes no arguments and has public getters for the properties to be assigned.
public class PingReport {
private long durationMs;
private boolean isUp;
private long timestampMillis;
public PingReport() {
// required by Firebase
}
public PingReport(long durationMs, boolean isUp, long timestampMillis) {
this.durationMs = durationMs;
this.isUp = isUp;
this.timestampMillis = timestampMillis;
}
public long getDurationMs() {
return durationMs;
}
@PropertyName("isUp")
public boolean isUp() {
return isUp;
}
public long getTimestampMillis() {
return timestampMillis;
}
}
Upvotes: 4
Reputation: 87
Dont use the primitive "boolean" type but use "Boolean" class instead.
Upvotes: -1
Reputation: 364451
You should check the naming convention in java.
Try to use:
private boolean up;
public boolean isUp() {
return up;
}
Upvotes: 0
Reputation: 38309
If your boolean field is named isUp
, then the getter must be named isIsUp()
or getIsUp()
. Alternatively, if you want a getter named isUp
, the field name would be up
.
Upvotes: 46
Reputation: 26
Your getter for isUp()
is not following the normal convention. Have you tried public boolean getIsUp()
?
Upvotes: 0