如何将 Firebase dataSnapshot 对象和密钥保存到 Kotlin DTO 数据中 class?
How to save Firebase dataSnapshot object and key into Kotlin DTO data class?
objective:从 Android 设备更新 Firebase 实时数据库。
我的数据结构简化了:
我的数据ClassTasksDTO.kt:
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()
}
}
我希望能够在 recyclerView 的 onclick item listener
函数中更新 firebase 数据。为此,我需要参考 key
来更新数据库。除非有更有效的方法。我愿意接受更正。
感谢您的帮助!
要获取密钥,您应该使用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()
}
感谢 Doug Stevenson 查看 OP 的评论。
科特林 1.4.32
像这样制作一个 kotlin class:
@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
)
}
}
当您从 Firebase 数据库调用中获得 DataSnapshot
作为响应(假设称为 it
)时,您可以执行以下操作:
var snap = (it as DataSnapshot)
var myTasksDTO = snap.getValue(TasksDTO::class.java)
objective:从 Android 设备更新 Firebase 实时数据库。
我的数据结构简化了:
我的数据ClassTasksDTO.kt:
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()
}
}
我希望能够在 recyclerView 的 onclick item listener
函数中更新 firebase 数据。为此,我需要参考 key
来更新数据库。除非有更有效的方法。我愿意接受更正。
感谢您的帮助!
要获取密钥,您应该使用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()
}
感谢 Doug Stevenson 查看 OP 的评论。
科特林 1.4.32
像这样制作一个 kotlin class:
@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
)
}
}
当您从 Firebase 数据库调用中获得 DataSnapshot
作为响应(假设称为 it
)时,您可以执行以下操作:
var snap = (it as DataSnapshot)
var myTasksDTO = snap.getValue(TasksDTO::class.java)