如何将 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)