Firebase Firestore toObject在布尔属性映射上失败

时间:2018-09-11 22:13:24

标签: 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(默认值)。

snapshot data

list of mapped object

我在做什么错了?

编辑: 我在Logcat中看到

W/Firestore: (0.6.6-dev) [zzevb]: No setter/field for isVip found on class ***.model.Img

根据Kotlin Docu

  

如果属性的名称以is开头,则将使用其他名称映射   使用规则:getter的名称将与属性相同   名称,并且将设置程序的名称替换为   组。例如,对于属性isOpen,getter将被调用   isOpen(),二传手将称为setOpen()。本规则适用   适用于任何类型的属性,而不仅仅是Boolean

也许是Kotlin问题的Firestore?

2 个答案:

答案 0 :(得分:7)

尝试将@field:JvmField添加到isValid布尔属性。

答案 1 :(得分:4)

如果在模型类中使用名为isVip的字段,类型为Boolean,则在使用以下代码行实例化Img类的对象时:

val img = Img("Y9X ... zYn", true, "Nombre", "https://...")

isVip属性在数据库中的显示方式将很简单:vip,而不是您可能期望的isVip。之所以将您的isVip属性存储为isVip而不仅仅是vip,是因为您没有使用助手类而是通过手动方式将数据添加到数据库中。

出现该警告的原因是因为您的数据库中有一个字段,该字段在模型类中具有对应项。在模型类中,您拥有一个名为isVip的字段,该字段在数据库中应具有一个名为vip的对应字段,并且现在为 not isVip。因此Firestore无法在这些字段之间创建连接,这就是您收到该警告的原因。

要解决此问题,您可以从模型中删除(如果可能)旧数据,并使用模型类添加新数据。您需要在名为isVip的模型类中拥有属性的名称,而在数据库中仅拥有vip

或者您可以将modelc类中的属性名称从isVip更改为简单的vip