【问题标题】:Cloud Firestore error while trying to retrieve List尝试检索列表时出现 Cloud Firestore 错误
【发布时间】:2018-07-11 00:01:25
【问题描述】:

我在一个个人项目中开始使用 Cloud Firestore,并且在尝试从文档中检索列表时遇到了问题,而我仍然设法从后端接收了一些数据,但在检查数据库时并不那么精确。

Collection
 DocumentN
     -otherStuff
     -usermatches:                <---- This is an array  
          (0): 
             -Score:0
             -Id:123 
          (1): 
             -Score:1
             -Id:456

架构

我一直在尝试,下面的课程是我暂时解决 错误 HashMap cannot be cast to parameter.. 但我不知道如何真正实现我需要的,如果您有任何反馈或有有什么建议请告诉我

Backend.kt

docRef = db.collection("userdata").document(user.user_id)
                docRef.get()
                        .addOnCompleteListener { task ->
                            if (task.isSuccessful) {

                                val document: DocumentSnapshot = task.result

                                val cedula = document.data!!["cedula"] as Long
                                val points = document.data!!["points"] as Long
 //                                    val usermatches = document.data!!["usermatches"] as HashMap<String, Any>
                                val alias = document.data!!["username"] as String

//                                     val usermatches = document.toObject(Usermatches::class.java)

                                val map: MutableMap<String, Any>? = document.data
                                for (entry in map!!.entries) {
                                    if (entry.key == "usermatches") {

                                        val list = entry.value as ArrayList<Any>

                                        for (each in list){

                                            for (entry2 in  each as HashMap<String, Any>){

                                                var home_score: Long = 0
                                                var winner: Long = 0
                                                var userchanged: Boolean = true
                                                var id: String = ""
                                                var away_score: Long = 0

                                                val usermatch = Usermatches(home_score, away_score, id, userchanged, winner)

                                                when {
                                                    entry2.key == "away_score" -> {
                                                        away_score = entry2.value as Long

                                                        usermatch.away_score = away_score
//                                                            println(away_score)
                                                    }
                                                    entry2.key == "home_score" -> {

                                                        home_score = entry2.value as Long
                                                        usermatch.home_score = home_score
//                                                            println(home_score)
                                                    }
                                                    entry2.key == "id" -> {
                                                        id = entry2.value as String
                                                        usermatch.id = id
//                                                            println(id)
                                                    }
                                                    entry2.key == "userchanged" -> {
                                                        userchanged = entry2.value as Boolean
                                                        usermatch.userchanged = userchanged
//                                                            println(userchanged)
                                                    }
                                                    entry2.key == "winner" -> {
                                                        winner = entry2.value as Long
                                                        usermatch.winner = winner
//                                                            println(winner)
                                                    }

                                                }
                                                mDisposable.add(usermatchesViewModel.insert(Usermatches(home_score, away_score, id, userchanged, winner))
                                                    .subscribeOn(Schedulers.io())
                                                    .subscribe{ println("Checking")})

                                            }
                                        }
                                    }
                                }

                            } else {
                                Log.d(TAG, "Error getting Usermatches ", task.exception)
                            }

                        }
            })

用户匹配数据类

@Entity
data class Usermatches(var home_score: Long,
                   var away_score: Long,
                   @ColumnInfo(name = "usermatches_id") var id: String,
                   var userchanged: Boolean,
                   var winner: Long) {
    @PrimaryKey(autoGenerate = true)
    var num_id: Long = 0
 }

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    -usermatches:

    不是!确实,如果一个对象作为array 存储在数据库中,entry.value 返回一个 ArrayList 而不是一个数组,但在您的情况下,usermatches 是一个map,其中包含其他映射,@987654325 @、1 等等。这就是为什么您也会收到该错误。因此,为了解决这个问题,您需要遍历 usermatches 映射两次,一次获取映射,第二次获取这些映射中的值。

    【讨论】:

      【解决方案2】:

      正如@Alex Mamo 指出的,它确实是一个 HashMap

      我在上面的代码片段中所做的与我实际解决问题的方式接近。

      我在第三个 for 循环中初始化我的 Object,并让它保存来自 Firestore DB 的不精确信息。

      解决方案:

      docRef = db.collection("userdata").document(user.user_id)
                      docRef.get()
                              .addOnCompleteListener { task ->
                                  if (task.isSuccessful) {
      
                                      val document: DocumentSnapshot = task.result
      
                                      val cedula = document.data!!["cedula"] as Long
      
                                      val points = document.data!!["points"] as Long
      
                                      val alias = document.data!!["username"] as String
      
                                      val map: MutableMap<String, Any>? = document.data
                                      for (entry in map!!.entries) {
                                          if (entry.key == "usermatches") {
      
                                              val list = entry.value as ArrayList<Any>
      
                                              var home_score: Long = 0
                                              var winner: Long = 0
                                              var userchanged: Boolean = true
                                              var id: String = ""
                                              var away_score: Long = 0
      
                                              for (each in list){
      
                                                  val usermatch = Usermatches(home_score, away_score, id, userchanged, winner)
      
                                                  for (entry2 in  each as HashMap<String, Any>){
      
                                                      when {
                                                          entry2.key == "away_score" -> usermatch.away_score = entry2.value as Long
                                                          entry2.key == "home_score" -> usermatch.home_score = entry2.value as Long
                                                          entry2.key == "id" -> usermatch.id = entry2.value as String
                                                          entry2.key == "userchanged" -> usermatch.userchanged = entry2.value as Boolean
                                                          entry2.key == "winner" -> usermatch.winner = entry2.value as Long
                                                      }
      
                                                  }
      
                                                  println("$usermatch")
                                                  mDisposable.add(usermatchesViewModel.insert(usermatch)
                                                          .subscribeOn(Schedulers.io())
                                                          .subscribe{println("Checking")})
                                              }
                                          }
                                      }
      
                                  } else {
                                      Log.d(TAG, "Error getting Usermatches ", task.exception)
                                  }
                              }
                  })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-26
        • 2020-04-10
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多