gpt4 book ai didi

android - 如何通过自定义对象从 Firestore 获取文档内容? (Android - Kotlin )

转载 作者:太空狗 更新时间:2023-10-29 14:36:52 25 4
gpt4 key购买 nike

我正在尝试从 Firestore 获取文档内容。以下图像链接显示了数据库结构 Firestore database structure

我想要什么:我想通过自定义对象获取文档内容并将内容添加到列表中。

问题:我收到此错误:E/AndroidRuntime: 致命异常: main 进程:com.example.aalmesbah.turoodpilot,PID:12160 java.lang.RuntimeException:无法反序列化对象。类 com.google.firebase.auth.UserInfo 没有定义无参数构造函数。如果您使用 ProGuard,请确保这些构造函数未被剥离

我尝试通过 get() 和 getString() 方法获取文档内容,但效果很好,问题仅在于 toObject()

我在这里搜索并尝试了其他问题的一些建议解决方案,例如为数据类添加默认值,但不幸的是,它没有用。

数据类代码:

data class UserInfo (val name: String? = "",
val email: String? = "",
val phoneNum: String? = "",
val address: String? = "") {
constructor(): this("","","", "" )

}

配置文件 fragment 代码:(文档内容应该显示的位置)

class ProfileFragment : Fragment() {

private lateinit var auth: FirebaseAuth
private lateinit var db: FirebaseFirestore


override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

val view = inflater.inflate(R.layout.fragment_profile, container, false)

auth = FirebaseAuth.getInstance()
db = FirebaseFirestore.getInstance()

return view
}

override fun onStart() {
super.onStart()

val userID = auth.currentUser?.uid
val docRef = db.collection("users").document(userID!!)

docRef.addSnapshotListener(EventListener<DocumentSnapshot> { documentSnapshot, e ->

if (e != null) {
Log.w(TAG, "Listen failed.", e)
return@EventListener
}

if (documentSnapshot != null && documentSnapshot.exists()) {

docRef.get().addOnSuccessListener { documentSnapshot ->
val userInfo = documentSnapshot.toObject(UserInfo::class.java)

emailTV.text = userInfo?.email
}
} else {

Log.d(TAG, "Current data: null")
}

})


}

}

注册 Activity 中的sendUserData()方法代码

private fun sendUserData() {

val name = userN.text.toString()
val email = userEm.text.toString()
val phone = userPhone.text.toString()
val addressName = addressName.text.toString()
val area = area.text.toString()
val block = block.text.toString()
val street = strees.text.toString()
val avenue = avenue.text.toString()
val house = house.text.toString()
val floor = floor.text.toString()
val apartment = apartment.text.toString()
val additionalInfo = additional.text.toString()

val address = "Addres Name: $addressName \n Area: $area \n B: $block ST: $street Av: $avenue H: $house\n " +
"Floor: $floor Apartment: $apartment \n Notes: $additionalInfo"

val userID = auth.currentUser?.uid

val userData = UserInfo(name, email, phone, address)

db.collection("users").document(userID!!).set(userData).addOnSuccessListener {
Toast.makeText(this, "Successfully Registered", Toast.LENGTH_SHORT).show()
}.addOnFailureListener{
Toast.makeText(this, "Data Upload error!", Toast.LENGTH_SHORT).show()
}


}

最佳答案

如果您想将 Kotlin 数据类与 documentSnapshot.toObject 一起使用,您必须将每个字段设为可为空的 var 而不是 val 。 Firestore SDK 不知道如何将文档字段映射到数据类构造函数参数。

如果您想要一个带有 val 字段的适当的不可变数据类,您将不得不手动从文档中读取每个字段,并自己调用数据类构造函数。

关于android - 如何通过自定义对象从 Firestore 获取文档内容? (Android - Kotlin ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com