【问题标题】:How to handle error when a field is not available in the Firestore database?当 Firestore 数据库中的字段不可用时如何处理错误?
【发布时间】:2021-12-25 01:31:07
【问题描述】:

我有一个带有一些属性的模型数据类。我在Firestore 中添加了一些数据,并使用这个模型类读取它们。后来,我决定在模型类中添加更多属性,但我没有在Firestore 数据库中添加新字段。当我像以前一样读取数据时,我的应用程序崩溃了。很明显,随着我们走得更远,我们会添加更多细节,但我们可能会也可能不会将这些新细节添加到已经添加到数据库中的旧项目中。我该如何处理这种情况?

这就是我从“Firestore”中读取数据的方式

mFireStore.collection("product_details")
                .get()
                .addOnCompleteListener {
                    if (it.isSuccessful) {
                        for (document in it.result) {
                            val product = document.toObject(ProductDetails::class.java)
                            product.product_id = document.id
                            productsList.add(product)

                        }
                    } else {
                    }
                    tempProductsList.addAll(productsList)
                    listProducts()
                }
                .addOnFailureListener {
                }

这就是我得到错误的地方。

val product = document.toObject(ProductDetails::class.java)

编辑: 下面提供了我的模型类的示例。它有很多字段,但我在这里只复制了几个。 'min_order_quantity' 和 'max_order_quantity' 是我在这个模型类中新添加的两个,Firestore 中已有的项目没有这些字段。

@Parcelize
data class ProductDetails(
    var product_id: String? = "",
    val title: String = "",
    val mrp: String= "0.00",
    val price: String = "0.00",
    val description: String = "",
    var min_order_quantity: String="",
    var max_order_quantity: String="",
) : Parcelable

Logcat:

Process: com.abc.xyz, PID: 19223
java.lang.VerifyError: Verifier rejected class com.abc.xyz.models.ProductDetails: void com.abc.xyz.models.ProductDetails.<init>() failed to verify: void com.abc.xyz.models.ProductDetails.<init>(): [0x1FB] Rejecting invocation, expected 1 argument registers, method signature has 2 or more (declaration of 'com.abc.xyz.models.ProductDetails' appears in /data/data/com.abc.xyz/code_cache/.overlay/base.apk/classes5.dex)
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
    at com.google.firebase.firestore.util.ApiUtil.newInstance(ApiUtil.java:43)
    at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:757)
    at com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:741)
    at com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:542)
    at com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
    at com.google.firebase.firestore.util.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:100)
    at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:183)
    at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:116)
    at com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:161)
    at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:97)
    at com.abc.xyz.ui.fragments.HomeFragment.getProductList$lambda-7(HomeFragment.kt:431)
    at com.abc.xyz.ui.fragments.HomeFragment.lambda$QeVGu-lWsXTqkddk(Unknown Source:0)
    at com.abc.xyz.ui.fragments.-$$Lambda$HomeFragment$QeVGu-lWsXTqkddk.onComplete(Unknown Source:2)
    at com.google.android.gms.tasks.zzj.run(com.google.android.gms:play-services-tasks@@17.2.0:4)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:246)
    at android.app.ActivityThread.main(ActivityThread.java:8633)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

【问题讨论】:

  • IIRC 在缺少字段的情况下,模型字段使用默认值初始化。您可以在问题中添加您的ProductDetails 模型吗?
  • @ArpitShukla 问题更新,请查收。
  • 这不是您当前的问题,但如果您不解决它可能会成为您的下一个问题。 productsList.addAll(productsList) 这会使您列表中的所有内容翻倍,我猜这不是您打算做的。
  • 如果您将列表中的所有内容重新添加到同一个列表中,所有内容现在都将出现在列表中两次。可能你打算做一些不同的事情......
  • @Codist 是的,如果您的模型中有一个字段在 firestore 中不存在,它将被初始化为其默认值(在您的情况下,min_order_quantity 将被初始化为 "" )。此外,如果您的模型中不存在 Firestore 中的字段,则在反序列化时将跳过该字段。

标签: android kotlin google-cloud-firestore


【解决方案1】:

这不是 firebase 字段的问题。尝试清除缓存并重新启动计算机。请参阅此相关问题以获取更多信息:

java.lang.VerifyError: Verifier rejected class on Lollipop when using release APK

如果您的模型中有一个不在 Firestore 中的字段,它将被初始化为其默认值。 (在你的情况下,“”)。

此外,如果模型中不存在 firestore 中的字段,则在反序列化期间将跳过该字段。 一个数据类只能有一定数量的参数,大概是245个。

【讨论】:

    【解决方案2】:

    据我了解,数据类可以拥有的参数数量是有限制的,我认为它是 245。我已经有 245 个,当我添加另外两个时,问题就开始了。当我删除任何两个参数时,它可以工作。感谢您的见解

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2020-03-17
      • 2014-12-05
      • 2021-10-21
      • 2021-10-16
      相关资源
      最近更新 更多