Android Firebase Firestore toObject在布尔属性映射上失败
从Firestore中提取数据时,我使用Android Firebase Firestore toObject在布尔属性映射上失败,android,firebase,kotlin,google-cloud-firestore,Android,Firebase,Kotlin,Google Cloud Firestore,从Firestore中提取数据时,我使用.toObject()将接收到的数据映射到我的数据类中,即: data class Img(var event_uid: String = "", var isVip: Boolean = false , var nombre: String = "", var url: String = "") 然而,映射效果并不好。我在任务中收到了字段isVip=>true,但对象字段被映射为false(默认值) 我做错了什么 编辑: 我在Logcat中看到了
.toObject()
将接收到的数据映射到我的数据类中,即:
data class Img(var event_uid: String = "", var isVip: Boolean = false , var nombre: String = "", var url: String = "")
然而,映射效果并不好。我在任务中收到了字段isVip=>true
,但对象字段被映射为false(默认值)
我做错了什么
编辑:
我在Logcat中看到了
W/Firestore: (0.6.6-dev) [zzevb]: No setter/field for isVip found on class ***.model.Img
根据:
如果属性的名称以is开头,则使用不同的名称映射
使用规则:getter的名称将与属性相同
名称,并通过将is替换为来获取setter的名称
设置例如,对于属性isOpen
,将调用getter
isOpen()
和setter将被调用setOpen()
。这条规则适用
用于任何类型的属性,而不仅仅是Boolean
可能是有Kotlin问题的Firestore?尝试将
@field:JvmField
添加到isValid
布尔属性。如果您在模型类中使用名为isVip
的字段,则在使用以下代码行实例化Img
类的对象时,该字段的类型为boolean
:
val img = Img("Y9X ... zYn", true, "Nombre", "https://...")
您的isVip
属性在数据库中的显示方式很简单:vip
,而不是您可能期望的isVip
。您的isVip
属性存储为isVip
,而不仅仅是vip
,这是因为您没有使用helper类将数据添加到数据库中,而是手动添加的
出现该警告的原因是,在数据库中有一个字段,该字段在模型类中有no对应项。在模型类中,您有一个名为isVip
的字段,该字段在数据库中应该有一个名为vip
和非isVip
的对应字段,就像现在一样。因此Firestore无法在这些字段之间创建连接,这就是为什么会出现该警告
要解决此问题,可以从数据库中删除(如果可能)旧数据,并使用模型类添加新数据。在模型类中,您需要将属性的名称命名为isVip
,而在数据库中只需vip
或者,您可以将modelc类中属性的名称从
isVip
更改为简单的vip
。您好,您的解释太棒了,谢谢。说得通。我在Angular webapp中创建文档时添加了此字段,现在使用我的Kotlin解决了此问题。我试着在Firestore换房子,然后工作了。然而,我应该在Angular应用程序中更改所有参考,这需要时间,但可能是正确的解决方案。现在为了解决我的问题,我用了@TheTechWolf来解决我的问题,我用了你的解决方案。但是,正确的方法应该是作为@Alex Mamo处理。您如何知道@field
属性?文档中没有提到它。你能告诉我在哪里可以读到更多关于它的资料吗?也许还有更多有用的属性。@t3chb0t@field
是Kotlin注释,它不是Firebase的一部分@JvmField
注释在这里起作用,它对Kotlin编译器说,它不应该创建isValid属性的getter和setter,而应该将此属性作为字段公开。您可以阅读有关@field
和其他注释使用站点目标的更多信息。