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

lor*_*eru 7 android kotlin firebase google-cloud-firestore

从Firestore中提取数据时,我将.toObject()接收到的数据映射到我的数据类中,即:

data class Img(var event_uid: String = "", var isVip: Boolean = false , var nombre: String = "", var url: String = "")
Run Code Online (Sandbox Code Playgroud)

但是,映射效果不佳。我isVip=>true在任务中收到了该字段,但是对象字段被映射为false(默认值)。

快照数据

映射对象列表

我究竟做错了什么?

编辑:我在Logcat中看到

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

根据Kotlin Docu的说法:

如果属性的名称以is开头,则使用不同的名称映射规则:getter的名称将与属性名称相同,setter的名称将通过用set替换is获得。例如,对于属性isOpen,将调用getter并将调用 isOpen()setter setOpen()。此规则适用于任何类型的属性,而不仅限于Boolean

也许有Kotlin问题的Firestore?

The*_*olf 13

尝试添加@field:JvmFieldisValidboolean属性。


Ale*_*amo 9

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

val img = Img("Y9X ... zYn", true, "Nombre", "https://...")
Run Code Online (Sandbox Code Playgroud)

您的isVip资产在数据库中的显示方式很简单:vip而不是isVip您可能预期的那样。您的isVip财产被存储的原因isVip不仅仅是vip因为您没有使用帮助类将数据添加到数据库中,而是以某种方式手动添加。

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

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

或者,您可以将 modelc 类中的属性名称从isVip更改为简单的vip,仅此而已。