Android 如何将Firebase dataSnapshot对象和密钥保存到Kotlin DTO数据类中?
目标:从Android设备更新Firebase实时数据库 我的数据结构简化了: 我的数据类任务到.kt:Android 如何将Firebase dataSnapshot对象和密钥保存到Kotlin DTO数据类中?,android,firebase,kotlin,dto,Android,Firebase,Kotlin,Dto,目标:从Android设备更新Firebase实时数据库 我的数据结构简化了: 我的数据类任务到.kt: data class TasksDTO(var customer : String ="", var date : String ="", var location : String ="", var key : String="") { } 我在onCreate下添加了一个addValueEve
data class TasksDTO(var customer : String ="", var date : String ="", var location : String ="", var key : String="") {
}
我在onCreate
下添加了一个addValueEventListener
:
private var allTasks = ArrayList<TasksDTO>()//Used to update recyclerView.
reference.child("tasks").addValueEventListener(object : ValueEventListener {
override fun onCancelled...
override fun onDataChange(dataSnapshot: DataSnapshot) {
val children = dataSnapshot.children
allTasks.clear()
children.forEach {
var taskObj = it.getValue()//without key: it.getValue(TasksDTO::class.java)
var task = TasksDTO()
with(task){
customer = taskObj.customer //**ERROR: Unresolved reference**
date = taskObj.date //**ERROR: Unresolved reference**
location = taskObj.location //**ERROR: Unresolved reference**
key = it.key!!
}
//
allTasks.add(task!!)
}
recyclerView.adapter!!.notifyDataSetChanged()
}
}
private var allTasks=ArrayList()//用于更新recyclerView。
reference.child(“任务”).addValueEventListener(对象:ValueEventListener{
一旦取消。。。
覆盖数据更改(dataSnapshot:dataSnapshot){
val children=dataSnapshot.children
allTasks.clear()
孩子们{
var taskObj=it.getValue()//不带键:it.getValue(TasksDTO::class.java)
var task=TasksDTO()
带(任务){
customer=taskObj.customer/**错误:未解析的引用**
日期=taskObj.date/**错误:未解析的引用**
location=taskObj.location/**错误:未解析引用**
钥匙=它。钥匙!!
}
//
所有任务。添加(任务!!)
}
recyclerView.adapter!!.notifyDataSetChanged()
}
}
我希望能够在recyclerView的onclick item listener
功能中更新firebase数据。为此,我需要引用键来更新数据库。除非有更有效的方法。我愿意更正
感谢您的帮助!要获取密钥,您应该使用getKey()
方法,例如:
taskObj = it.getKey()
HashMap存储键和值对,这些键和值对可以被引用,而不像数据库中的对象
var taskObj = it.getValue() as HashMap<*, *>
var task = TasksDTO()
with(task){
customer = taskObj ["customer"].toString()
key = it.key.toString()
date = taskObj ["date"].toString()
location = taskObj ["location"].toString()
}
var taskObj=it.getValue()作为HashMap
var task=TasksDTO()
带(任务){
customer=taskObj[“customer”].toString()
key=it.key.toString()
date=taskObj[“date”].toString()
location=taskObj[“location”].toString()
}
道格·史蒂文森(Doug Stevenson)的功劳参见OP的评论。Kotlin 1.4.32
制作一个kotlin类,如下所示:
@IgnoreExtraProperties
data class TasksDTO(
var customer: String? = "",
var date: String? = "",
var location: String? = ""
){
constructor() : this("", "", "") {}
@Exclude
fun toMap(): Map<String, Any?> {
return mapOf(
"customer" to customer,
"date" to date,
"location" to location
)
}
}
var snap = (it as DataSnapshot)
var myTasksDTO = snap.getValue(TasksDTO::class.java)
根据您现在掌握的代码,taskObj将是一个带有字符串键和对象值的映射。您需要使用该映射来提取子值。看起来您是在假设它是其他东西?我根据以下文档假设它是一个对象:是的,在这种情况下,如果数据库中的东西有子值。你不能简单地开始引用对象上的属性-编译器不知道这些东西是否真的存在。我建议你启动一个调试器来看看发生了什么。这不是问题所在。将值对象和键值一起传递到数据类中是我不知道如何完成的事情。不过,谢谢。