Firebase Firestore toObject() 不适用于数据类

Sch*_*yer 6 android kotlin firebase google-cloud-firestore

我想从 firebase firestore 获取数据并使用数据类转换 toObject() 。但它不起作用,因为对象已初始化但未设置字段。

这与 Kotlin 的 Firebase Firestore toObject()非常相似。但我已经使用了使用数据类的建议答案,但它仍然不起作用。

数据类

data class DataClass(
    var str : String = "default",
    var int : Int = 0,
    var bool: Boolean = false
)
Run Code Online (Sandbox Code Playgroud)

备注:使用非数据类或更改变量名称(在代码数据库中)没有任何区别。

我实际上想使用更复杂的数据/对象,但剥离了其他所有内容以使其首先工作。

代码

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")
}
Run Code Online (Sandbox Code Playgroud)

日志猫

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)
Run Code Online (Sandbox Code Playgroud)

数据库

数据库

所以问题似乎是No setter/field for available find,但该字段就在那里,例如cluster.bool= false可以工作。Kotlin Reference-data 类中没有提到显式的 setter 方法,因此我无法setStr() 按照此处所述进行调用。

我对 Android 开发和 Kotlin 比较陌生,怀疑有一个非常基本的错误,即使花了几个小时爬遍 SO 和参考文献,我也无法自己修复这个错误。

谢谢。

小智 5

我遇到了类似的问题,具有相同的错误消息(没有 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 = ""
)
Run Code Online (Sandbox Code Playgroud)

然后转换为对象,如下所示:

val user: User? = documentSnapshot.toObject(User::class.java)
Run Code Online (Sandbox Code Playgroud)