【问题标题】:Firestore boolean returns false when its set up to trueFirestore 布尔值在设置为 true 时返回 false
【发布时间】:2020-06-23 23:59:29
【问题描述】:

我有一个非常奇怪的问题,我已经运行了调试器并单步执行代码以查看 Firestore 中的每个元素

我的 Firestore 数据库中有一个产品列表

结构

shop -> shopId -> products -> productList

我有一个如下的数据类

@Parcelize
data class Producto(
    val imagenProducto: String = "",
    val nombreProducto: String = "",
    val descProducto: String = "",
    val precio: Int = 0,
    val hasDescuento: Boolean = false,
    val tipoDescuento: Double = 0.0,
    val isCombo: Boolean = false
) : Parcelable

现在,我用来按isCombo 过滤的代码创建两个列表,其中一个将包含所有产品(如果需要折扣)和组合(如果isCombo 布尔值设置为true)

现在,这很奇怪,因为我的代码会获取所有这些文档并将其发送到我的视图

suspend fun getProductosList(comercioId:String):Resource<MutableList<Producto>>{
        val productList = mutableListOf<Producto>()
        val snapshot = FirebaseFirestore.getInstance().collection("comercios").document(comercioId).collection("products").get().await()
        for(producto in snapshot){
            productList.add(producto.toObject(Producto::class.java))
        }
        return Resource.Success(productList)
    }

这里我有一个子集合,其中包含商店(comercio)的最终产品。

问题

所以,事情是这样的,在我获取所有这些文档之后,列表出现在我的视图中,其中包含列表中每个元素的数据,但是产品的一个值没有按预期出现。

我在一个文档 isCombo = true 中有位置,但是当这涉及到我的应用程序时,它将此值设置为 false,但另一个布尔值 hasDescuento 带有正确的值

我尝试过的

  • 清理并重建
  • 使缓存无效/重启
  • 使用调试器逐步查看每个元素,看看我是不是 用错字插入我的变量
  • 检查我对数据的引用

这是输出,这就是我将数据存储在我的参考文献中的方式

这里 isCombo 设置为 true

现在,这就是我在检索此文档时看到的结果

所以,这里isCombo 为假,但我的另一个布尔值 h​​asDescuento 带有来自数据库的正确值(对于另一个不同的产品),我怀疑我的数据类中的 Parcelize 注释,但所有其他数据那不是 isCombo 是正常获取的

会发生什么?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    千万不要,尝试使用 isDone, isCombo, isDeclared,...etc 字段(即字段不能以 is 为前缀),同时创建辅助类,否则这将导致 Firebase 映射与您的 getters()setters() 方法发生冲突。

    此行可能出现错误:

    // Here bannerSnapshot is a QueryDocumentSnapshot object
    CreateOfferObject product = bannerSnapshot.toObject(CreateOfferObject.class);
    

    [注意:此错误通常发生在布尔字段中。]

    我有同样的问题,只是通过更改字段名称、重置 getter() 和 setters() 来解决它。

    希望!它有帮助。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我发现了这个solution

      data class Producto(
          val imagenProducto: String = "",
          val nombreProducto: String = "",
          val descProducto: String = "",
          val precio: Int = 0,
          val hasDescuento: Boolean = false,
          val tipoDescuento: Double = 0.0,
          @field:JvmField // use this annotation if your Boolean field is prefixed with 'is'
          val isCombo: Boolean = false
      )
      

      https://firebase.google.com/docs/firestore/manage-data/add-data#kotlin+ktx_3

      【讨论】:

        【解决方案3】:

        似乎 isCombo 之前的属性在 Firestore 中的映射方式不同,并且仅映射为 combo 而不是 isCombo,所以,将属性名称更改为hasCombo,清理并重建项目并运行。

        感谢亚历克斯Firebase Firestore toObject fails on Boolean property mapping

        并将在文档中填写关于 boolean 数据类型注释的建议。

        https://firebase.google.com/docs/firestore/manage-data/data-types

        【讨论】:

        • 我怀疑 isCombo 被解释为名为 combo 的布尔属性的吸气剂。请记住,Firebase/Firestore 遵循 JavaBean 模式进行属性命名,这就是其中之一。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        相关资源
        最近更新 更多