Как перенести (изменяемую) карту в класс объектов передачи данных в Kotlin? - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть проект Firebase, который содержит коллекцию задач Firestore, связанную с:

  • taskNumber (, установленный как идентификатор документа )
  • site (имя)
  • статус
  • местоположение ( необязательно )
  • описание ( необязательно )
  • примечания ( опционально )
  • длиной ( опционально )
  • широта ( опционально )

Там дополнительные поля в Firestore, которые я не могу sh передать в объект передачи данных, такие как long и lat

Вот пример структуры данных Firebase Firestore: enter image description here

Я использую прослушиватель снимков для прослушивания изменений, внесенных в базу данных, затем добавляю нужные документы в arrayList, который я затем отображаю в представлении рециркулятора

Когда Я пытаюсь запустить приведенный ниже код. Я получаю сообщение об ошибке несоответствия типов @ TaskDTO (taskObj). Как разрешить классу TaskDTO принимать карту?

Код:

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 принимать карту?

1 Ответ

1 голос
/ 01 февраля 2020

Если я вас правильно понял, вы пытаетесь инициализировать TaskDTO с помощью MutableMap, но ваш класс TaskDTO не имеет конструктора для этого случая. Вы должны создать новый класс (для этого случая я использую singleton), например TaskMapper с методом fun mapTaskDTO(map: MutableMap), который создает и возвращает экземпляр класса TaskDTO на основе значений в экземпляре 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)
...