Firebase Firestore toObject()无法与数据类一起使用

时间:2019-11-30 22:40:14

标签: android firebase kotlin google-cloud-firestore

我想从Firebase Firestore获取数据,并使用数据类将其转换为Object()。但是,由于对象已初始化但未设置该字段,因此它不起作用。

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

数据类

my_socket.connect(('127.0.0.1', 8200))  # connects to the server

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

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

代码

data class DataClass(
    var str : String = "default",
    var int : Int = 0,
    var bool: Boolean = false
)

Logcat

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")
}

数据库

Database

因此问题似乎是找不到可用的设置器/字段,但是该字段存在,例如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) 有效。 Kotlin Reference - data class中没有提及显式的setter方法,我无法调用cluster.bool= false as mentioned here

我对Android开发和Kotlin还是比较陌生,并且怀疑这是一个非常基本的错误,即使花了几个小时来浏览SO和References,我也无法自行解决。

谢谢。

1 个答案:

答案 0 :(得分:0)

我也遇到了同样的错误消息(没有设置器/字段...),我通过在数据类中添加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)