首页 > 解决方案 > 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 和参考,我也无法自行修复。

谢谢你。

标签: androidfirebasekotlingoogle-cloud-firestore

解决方案


我遇到了同样的错误消息(没有 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)

推荐阅读