我想从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")
}
数据库
因此问题似乎是找不到可用的设置器/字段,但是该字段存在,例如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,我也无法自行解决。
谢谢。
答案 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)