【问题标题】:prevent return null when variable does not exists at firebase当firebase中不存在变量时防止返回null
【发布时间】:2020-07-01 22:48:28
【问题描述】:

我有一个有一组值的 pojo

data class Product(val productId:String = "",val name:String = "", val image:String = "", val price: Int = 0, val hasDiscount:Boolean = false)

在 firebase,我有时会使用 hasDiscount 加载我的产品,有时我不会将该属性设置为我指定默认 hasDiscount 值为 false 的产品,因此当我从 Firestore 获取数据时,我会得到 null字段,然后我的产品列表没有返回,我的列表没有填充

suspend fun getProductList(shopId:String):Resource<MutableList<Product>>{
        val productList = mutableListOf<Product>()
        val snapshot = FirebaseFirestore.getInstance().collection("shops").document(shopId).collection("products").orderBy("hasDiscount",
            Query.Direction.DESCENDING).get().await()
        for(product in snapshot){
            val produdctId = product.id
            val productName = product.getString("name")!!
            val productImage = product.getString("image")!!
            val productPrice = product.getLong("price").toInt()!!
            val hasDiscount = product.getBoolean("hasDiscount")!! // here is my error, I'm assuming that this value is not null, but is null at the database, if I change my pojo with all ? as posible null values I also get the same here
            productList.add(Product(produdctId,productName,productImage,price,hasDiscount))
        }
        return Resource.Success(productList)
    }

现在,如果我将所有属性添加到我的 pojo 中?操作数表示每个值都可以为 null 并删除 !!到我的数据存储中的 getLong、字符串等,我不会得到我在 POJO 中创建的默认值,而是会出现 null。

所以我有一个产品 productId, name , image , price 但 hasCombo 可能在或不在数据库中,如果该变量不在我要返回的产品中,则返回 false ,如果找不到该变量,则不为 null

编辑

已将@Exclude 属性用于产品并不总是需要但问题仍然存在的属性

编辑 2

在 Firebase 的某些产品项目中,我没有字段 hasDiscount,当我获取产品列表并且一个产品没有此字段时,我想返回 false 而不是 null,因为在我的数据类中,我将 false 作为hasDiscount 字段的默认值

如果我这样做

   data class Product(val productId:String = "",val name:String = "", val image:String = "", val price: Int = 0, val hasDiscount:Boolean? = false)

还有这个

...
val hasDiscount = product.getBoolean("hasDiscount")
productList.add(Product(produdctId,productName,productImage,price,hasDiscount))

也返回null,不知道为什么,因为我明确说过如果hasCombo不是文档中的字段,我想返回false而不是null

【问题讨论】:

  • 添加检查快照是否存在snapshot.exist
  • 会检查整个产品是否存在,但如果属性为null则不给它默认值false,这也会产生同样的问题
  • 仅供参考,这不会编译:val price: Int = ""
  • 抱歉,已编辑,我的问题写错了
  • @DougStevenson 我已经编辑了我的问题,知道为什么会这样吗?

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

好的,所以我使用了三元运算符,如果值为 null,则返回默认值,所以,数据类初始化只是为 Firebase 创建一个空构造函数以使用document.toObject(pojo::class.java),所以,如果你想要要为可能不是 Firebase 中对象的字段的属性返回默认值,请执行此操作

val hasDiscount = product.getBoolean("hasDiscount")?: false

那么,如果你不使用toObject(),它不需要有一个空的构造函数

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2013-10-24
    • 2014-12-22
    • 2013-05-11
    相关资源
    最近更新 更多