Firebase不会将布尔值绑定到字段

时间:2016-06-03 22:36:42

标签: android firebase firebase-realtime-database

我正在使用谷歌的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。我尝试了不同的命名方式upisUp以及mUp,并添加了setter setUp(boolean up)setIsUp(boolean isUp),但似乎没有任何效果。 Android SDK的文档不是很详细。是否有一些我忽略的技巧或细节?

7 个答案:

答案 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”类。