Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何将Firebase dataSnapshot对象和密钥保存到Kotlin DTO数据类中?_Android_Firebase_Kotlin_Dto - Fatal编程技术网

Android 如何将Firebase dataSnapshot对象和密钥保存到Kotlin DTO数据类中?

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

目标:从Android设备更新Firebase实时数据库

我的数据结构简化了:

我的数据类任务到.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()
        

    }

}
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将是一个带有字符串键和对象值的映射。您需要使用该映射来提取子值。看起来您是在假设它是其他东西?我根据以下文档假设它是一个对象:是的,在这种情况下,如果数据库中的东西有子值。你不能简单地开始引用对象上的属性-编译器不知道这些东西是否真的存在。我建议你启动一个调试器来看看发生了什么。这不是问题所在。将值对象和键值一起传递到数据类中是我不知道如何完成的事情。不过,谢谢。