【发布时间】: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