当在firebase上不存在变量时,防止返回null

问题描述 投票:0回答:2

我有一个具有一组值的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,string等,我将无法获得在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

android firebase kotlin google-cloud-firestore
2个回答
0
投票

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

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

然后,如果您不使用toObject(),则不需要具有空的构造函数


0
投票

检查下面的代码,现在可以正常工作。只需使用elvis运算符即可。

  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, 
                val hasDiscount = product.getBoolean("hasDiscount")?:false,  //correct implementation "!!" means if its null throw null pointer exception

      productList.add(Product(produdctId,productName,productImage,price,hasDiscount))
            }
© www.soinside.com 2019 - 2024. All rights reserved.