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
的字段,它在数据库中应该有一个名为 vip
和 not 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 中创建集合时