【问题标题】:DocumentReference.set(Object o) changes boolean field namesDocumentReference.set(Object o) 更改布尔字段名称
【发布时间】:2017-11-14 09:31:56
【问题描述】:

使用DocumentReference.set(object) 时,布尔字段会发生变化。带有“is”前缀的字段被更改为普通字段值

class Invitation {
    private boolean isRequested;
    private boolean isValid;
    private boolean isAccepted;
    private String lastName,firstName;
    private long sentOn;
}

当我使用set() 方法将此对象推送到数据库时,布尔值以这种方式更改:

【问题讨论】:

  • 我使用的是安卓
  • 你必须传递虚拟数据!
  • 不,我正在创建一个邀请类并通过 set 方法推送它
  • 您正在推送空值。?或者它总是替换同一个对象。?
  • 其中少数未初始化,稍后将使用更新方法进行更新

标签: android firebase google-cloud-firestore


【解决方案1】:

这是一个自动翻译,因此可以将 getter 命名为 isBoolean 而不是 getBoolean

在 Android 中,您可以使用 @PropertyName annotation 重命名属性,这将允许您指定其他名称(在本例中为确切名称),Firebase 应按原样使用:

class Invitation {
    private boolean isRequested;

    @PropertyName(value="isRequested")
    public boolean isRequested() {
        return this.isRequested;
    }

    @PropertyName(value="isRequested")
    public void setRequested(boolean value) {
        this.isRequested = value;
    }

    // ...
}

但是,我建议在字段名称上删除 is 前缀,而仅将其用于 getter,例如:

public boolean isRequested() {
    return this.requested;
}

【讨论】:

  • 查看我的编辑,您实际上需要在 getter 和 setter 上指定 @PropertyName 注释,而不是字段。
  • 对不起,我把它用于字段值
  • 为什么属性名和getter不能一样?
【解决方案2】:

我们遇到了这个问题,我们就这样解决了。

boolean isPrimary;

public boolean getIsPrimary() {
    return this.isPrimary;
}

public void setIsPrimary(boolean isPrimary) {
    this.isPrimary = isPrimary;
}

我知道这很奇怪。似乎 Firestore 使用 'getter' 方法来设置对象, 因为我首先更改了“setter”方法,但什么也没发生。我改变了“getter”方法,它终于正常工作了。

我希望他们能解决这个问题。因为在 Android 中没有人将布尔值的“getter”方法用作“getIsSomething”。

【讨论】:

  • 因为在 Android 中没有人使用布尔值的 'getter' 方法作为 'getIsSomething'。 虽然这是真的,但想法是该字段应该命名为 something 和getter 应该是isSomething(),那么就不需要使用getIsSomething()。不需要在私有字段名称上加上 is 前缀。
  • @Grimthorr 你说得对。通常Java中布尔值的命名约定与您所说的相同。但 Firebase 是一个跨平台框架。在 Javascript 中,命名约定为 isSomething 更为常见。我们的服务也不仅仅适用于 Android。我的想法是,如果某些 3rd 方框架强制执行特定的命名约定,这不是一个好主意。
【解决方案3】:

在 Kotlin 中,使用 @field:JvmField。例如,

data class User(
    @field:JvmField
    val isEnrolled: Boolean = false
)

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2010-11-29
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多