如何在 Kotlin 中将(可变)映射传输到数据传输对象 Class?
How to transfer a (Mutable)Map to an Data Transfer Object Class in Kotlin?
我有一个 Firebase 项目,其中包含一个 Firestore 任务集合,这些任务具有以下关联:
- taskNumber(设为文档ID)
- 站点(名称)
- 状态
- 位置(可选)
- 描述(可选)
- 备注(可选)
- 长(可选)
- lat(可选)
我不希望将 Firestore 中的其他字段传递到数据传输对象中,例如 long
和 lat
以下是 Firebase Firestore 数据结构的示例:
我使用快照侦听器来侦听对数据库所做的更改,然后将所需的文档添加到 arrayList,然后我将其显示在回收器视图中
当我尝试运行下面的代码时,出现类型不匹配错误@TaskDTO(taskObj)
我如何允许 TaskDTO class 接受 Map?
代码如下:
val collRef = db.collection("centa_tasks").orderBy("scheduled_date")
collRef.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if (firebaseFirestoreException != null) {
...
}
...
for ((index,doc) in querySnapshot!!.withIndex()) {
//Get the main values:
var taskObj = doc.data
//Add the task_number:
taskObj["task_number"] = doc.id
//Here I compare the current date to the previous date to determine if day item needs
//to be shown:
if(index != 0) {
val ts1: Timestamp = querySnapshot.documents[index - 1]["scheduled_date"] as Timestamp
val ts2: Timestamp = taskObj["scheduled_date"] as Timestamp
taskObj["showDate"] = ts1 != ts2
}else{
taskObj["showDate"] = true
}
val task = TaskDTO(taskObj) //This is the line of code that needs to be changed.
allTasks.add(task) //I add the task to an arrayList that is sent to recycler adapter.
}
这是包含可选参数的数据传输对象:
TaskDTO.kt:
data class TaskDTO(var site : String,
var taskNumber : String,
var status: Int,
var showDate : Boolean,
var scheduled_date : Timestamp = Timestamp(Date(-1)), //optional
var description : Int = 1, //optional
var location : String = "No location set!", //optional
var notes : String = "" //optional
) {
}
当我尝试 运行 上面的代码时,出现类型不匹配错误@TaskDTO(taskObj)
我如何允许 TaskDTO class 接受 Map?
如果我没理解错的话,你正试图用 MutableMap 初始化 TaskDTO
,但是你的 TaskDTO
class 没有针对这种情况的构造函数。您应该创建新的 class(我在这种情况下使用单例),例如 TaskMapper
使用方法 fun mapTaskDTO(map: MutableMap)
创建和 returns TaskDTO
class 基于 MutableMap 实例中的值。
注意! 不应按原样使用此代码。这只是一个例子,它应该告诉你解决问题的方法。
object TaskMapper{
fun mapTaskDTO(map: MutableMap<String, String>): TaskDTO{
return TaskDTO(map["site"]!!,
map["taskNumber"]!!,
map["status"]!!.toInt(),
map["showDate"]!!.toBoolean())
}
}
然后像这里一样使用它
val task = TaskMapper.mapTaskDTO(taskObj)
我有一个 Firebase 项目,其中包含一个 Firestore 任务集合,这些任务具有以下关联:
- taskNumber(设为文档ID)
- 站点(名称)
- 状态
- 位置(可选)
- 描述(可选)
- 备注(可选)
- 长(可选)
- lat(可选)
我不希望将 Firestore 中的其他字段传递到数据传输对象中,例如 long
和 lat
以下是 Firebase Firestore 数据结构的示例:
我使用快照侦听器来侦听对数据库所做的更改,然后将所需的文档添加到 arrayList,然后我将其显示在回收器视图中
当我尝试运行下面的代码时,出现类型不匹配错误@TaskDTO(taskObj) 我如何允许 TaskDTO class 接受 Map?
代码如下:
val collRef = db.collection("centa_tasks").orderBy("scheduled_date")
collRef.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if (firebaseFirestoreException != null) {
...
}
...
for ((index,doc) in querySnapshot!!.withIndex()) {
//Get the main values:
var taskObj = doc.data
//Add the task_number:
taskObj["task_number"] = doc.id
//Here I compare the current date to the previous date to determine if day item needs
//to be shown:
if(index != 0) {
val ts1: Timestamp = querySnapshot.documents[index - 1]["scheduled_date"] as Timestamp
val ts2: Timestamp = taskObj["scheduled_date"] as Timestamp
taskObj["showDate"] = ts1 != ts2
}else{
taskObj["showDate"] = true
}
val task = TaskDTO(taskObj) //This is the line of code that needs to be changed.
allTasks.add(task) //I add the task to an arrayList that is sent to recycler adapter.
}
这是包含可选参数的数据传输对象: TaskDTO.kt:
data class TaskDTO(var site : String,
var taskNumber : String,
var status: Int,
var showDate : Boolean,
var scheduled_date : Timestamp = Timestamp(Date(-1)), //optional
var description : Int = 1, //optional
var location : String = "No location set!", //optional
var notes : String = "" //optional
) {
}
当我尝试 运行 上面的代码时,出现类型不匹配错误@TaskDTO(taskObj) 我如何允许 TaskDTO class 接受 Map?
如果我没理解错的话,你正试图用 MutableMap 初始化 TaskDTO
,但是你的 TaskDTO
class 没有针对这种情况的构造函数。您应该创建新的 class(我在这种情况下使用单例),例如 TaskMapper
使用方法 fun mapTaskDTO(map: MutableMap)
创建和 returns TaskDTO
class 基于 MutableMap 实例中的值。
注意! 不应按原样使用此代码。这只是一个例子,它应该告诉你解决问题的方法。
object TaskMapper{
fun mapTaskDTO(map: MutableMap<String, String>): TaskDTO{
return TaskDTO(map["site"]!!,
map["taskNumber"]!!,
map["status"]!!.toInt(),
map["showDate"]!!.toBoolean())
}
}
然后像这里一样使用它
val task = TaskMapper.mapTaskDTO(taskObj)