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

Posted

技术标签:

【中文标题】Firebase Firestore toObject 在布尔属性映射上失败【英文标题】:Firebase Firestore toObject fails on Boolean property mapping 【发布时间】:2019-02-16 11:39:59 【问题描述】:

在从 Firestore 中提取数据时,我使用.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

根据Kotlin Docu:

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

可能是带有 Kotlin 问题的 Firestore?

【问题讨论】:

【参考方案1】:

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

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

isVip 属性在数据库中的样子很简单:vip,而不是您可能预期的isVip。您的isVip 属性存储为isVip 而不仅仅是vip 的原因是您没有使用帮助程序类将数据添加到数据库中,而是以某种方式手动添加。

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

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

或者您可以将您的模型类中的属性名称从isVip 更改为简单的vip,就是这样。

【讨论】:

您好,您的解释很棒,谢谢。让一切都有意义。我在我的 Angular webapp 中创建文档时添加了这个字段,现在使用我的 Kotlin 时遇到了这个问题。我尝试更改 Firestore 中的属性并工作。但是,我应该在我的 Angular 应用程序中更改所有引用,这需要时间,但可能是正确的解决方案。为了解决我现在的问题,我使用了@TheTechWolf solution【参考方案2】:

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

【讨论】:

为了解决我的问题,我采用了您的解决方案。但是,正确的方法应该是@Alex Mamo says。 您如何知道@field 属性? toObject 文档中没有提到它。你能指出我在哪里可以阅读更多关于它的信息吗?也许还有更多有用的属性。 @t3chb0t @field 是 Kotlin 注释,它不是 Firebase 的一部分。 @JvmField 注释在这里起到了作用,它告诉 Kotlin 编译器它不应该创建 isValid 属性的 getter 和 setter,并且应该将此属性作为字段公开。您可以阅读更多关于@field 和其他注释使用站点目标here 的信息。

以上是关于Firebase Firestore toObject 在布尔属性映射上失败的主要内容,如果未能解决你的问题,请参考以下文章

使用Firestore需要firebase-firestore.js文件吗?

无法在firebase.firestore.CollectionReference中使用Array firebase.firestore.Query为什么?

(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时

Firestore 配置 - Firebase

firebase2.default.firestore 不是一个函数 - React Firebase

忽略 firebase.firestore.timestamp