我正在使用谷歌的firebase-database SDK for Android,v9.0.1。我将我的应用程序连接到Firebase,可以在不同位置读取和写入数据。
但是,我无法使用dataSnapshot.getValue(PingReport.class)
获取特定的布尔字段,并且当我的模型中明显存在字段时,我的日志中会出现No setter/field for isUp found on class com.myapp.PingReport
的错误。
以下是Firebase数据库中的JSON:
{
"durationMs": 364,
"isUp": true,
"timestampMillis": 1464916019971
}
这是模型类:
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;
}
}
如果我致电getDurationMs()
或getTimestampMillis()
,则会返回正确的值,但isUp()
返回的值始终为false
。我尝试了不同的命名方式up
和isUp
以及mUp
,并添加了setter setUp(boolean up)
和setIsUp(boolean isUp)
,但似乎没有任何效果。 Android SDK的文档不是很详细。是否有一些我忽略的技巧或细节?
答案 0 :(得分:36)
如果您的布尔字段名为isUp
,则必须将getter命名为isIsUp()
或getIsUp()
。或者,如果您想要一个名为isUp
的getter,则字段名称为up
。
答案 1 :(得分:3)
或者,您可以使用Firebase数据库中的@PropertyName批注来处理此问题。另外,最好也包括二传手。
传递一个自定义Java对象,如果定义该对象的类具有不带参数的默认构造函数,并且具有要分配的属性的公共获取器。
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;
}
}
答案 2 :(得分:0)
isUp()
的getter不符合正常约定。你试过public boolean getIsUp()
吗?
答案 3 :(得分:0)
您应该检查java中的命名约定。
尝试使用:
private boolean up;
public boolean isUp() {
return up;
}
答案 4 :(得分:0)
我在科特林遇到了这个问题。我有几个布尔值。除以is
开头的代码外,其他所有参数均已正确设置。为了解决这个问题,我将其作为客户获取者,并解决了该问题:
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
}
}
答案 5 :(得分:0)
请勿在变量名中使用“ is”,尤其是在Firebase Realtime Database中。我也遇到了同样的问题,我必须将变量名从“ isUserExist”更改为“ userExist”!火爆的基地!
答案 6 :(得分:-1)
不要使用原语“boolean”类型,而是使用“Boolean”类。