android - Firebase Firestore toObject()不适用于数据类
问题描述
我想从 firebase firestore 获取数据并使用数据类转换 toObject()。但它不起作用,因为对象已初始化但未设置字段。
这与使用 Kotlin 的 Firebase Firestore toObject()非常相似。但是我已经使用了使用数据类的建议答案,但它仍然无法正常工作。
数据类
data class DataClass(
var str : String = "default",
var int : Int = 0,
var bool: Boolean = false
)
备注:使用非数据类或更改 var 名称(在代码和数据库中)没有任何区别。
我实际上想使用更复杂的数据/对象,但剥离了其他所有内容以使其首先工作。
代码
val clusterRef = db.collection("cluster")
clusterRef.document("e8efpRf2FBPwByWqaIRe").get(Source.SERVER).addOnSuccessListener { documentSnapshot ->
Log.d(TAG, "${documentSnapshot.id} => ${documentSnapshot.data}")
val cluster = documentSnapshot.toObject(DataClass::class.java)
Log.d(TAG,"${cluster?.str} ${cluster?.int} ${cluster?.bool}")
Log.d(TAG, "object: $cluster")
}
日志猫
e8efpRf2FBPwByWqaIRe => {str=HelloWorld, bool=true, int=42}
W/Firestore: (21.3.0) [k]: No setter/field for str found on class c.d.a.c.a
W/Firestore: (21.3.0) [k]: No setter/field for bool found on class c.d.a.c.a
W/Firestore: (21.3.0) [k]: No setter/field for int found on class c.d.a.c.a
default 0 false
object: DataClass(str=default, int=0, bool=false)
数据库
所以问题似乎是No setter/field for available found,但该字段存在,例如cluster.bool= false
有效。Kotlin 参考数据类中没有提到显式设置方法,我不能setStr()
像这里提到的那样调用。
我对 Android 开发和 Kotlin 比较陌生,并且怀疑一个非常基本的错误,即使花了几个小时浏览 SO 和参考,我也无法自行修复。
谢谢你。
解决方案
我遇到了同样的错误消息(没有 setter/field ...)的类似问题,我通过在数据类中添加 get/set 注释解决了这个问题,即:
data class User(
@get: PropertyName("first_name") @set: PropertyName("first_name") var firstName: String = "",
@get: PropertyName("last_name") @set: PropertyName("last_name") var lastName: String = "",
@get: PropertyName("email") @set: PropertyName("email") var email: String = ""
)
然后转换成这样的对象:
val user: User? = documentSnapshot.toObject(User::class.java)
推荐阅读
- javascript - 函数 .push 不断替换数组中与最后一个相同的所有元素
- java - 尝试在空对象引用上调用虚拟方法“void android.view.View.measure(int, int)”
- javascript - this.setState 没有更新
- python - 数组切片 Numpy
- mysql - 制作可移植的 Mysql 和 NodeJS
- javascript - 从函数而不是 DOM 元素将 DOM 事件从子级调度到父级(没有 createEventDispatcher)
- c - 如何更改文件内的整数而不将文件复制到另一个文件
- c++ - 为什么在没有 -DPASS 的情况下编译下面的测试用例对 sfinae 不友好
- c# - 如何提高 Alturos.YOLO 在网络摄像头上的性能?
- c# - 错误:我是 C# 编程的新手,我很想开始使用 VSCODE 作为文本编辑器