首页 > 解决方案 > HashMap 为空,因此我无法从 Firebase 数据库获取模拟器中显示的数据

问题描述

Android studioALT + ENTER用代码显示警告

 val name = data[USERNAME] as String

变成了

val name = data?.get(USERNAME) as String

但我的模拟器仍然崩溃

 thoughtsCollectionRef.get()
.addOnSuccessListener { snapshot -> 
for(document in snapshot.documents){
val data = document.data 

//this is my code after listening to android studio 

val name = data?.get(USERNAME) as String
val timestamp = data?.get(TIMESTAMP) as Date
val thoughtTxt = data?.get(THOUGHT_TXT) as String
val numLikes = data?.get(NUM_LIKES) as Long
val numComments = data?.get(NUM_COMMENTS) as Long
 val documentId = document.id

//我用 编辑了所有其他变量,但safecall ?.get()它仍然崩溃

 val newThought = Thought(name,timestamp,thoughtTxt,numLikes.toInt(),numComments.toInt(),
                    documentId)


thoughts.add(newThought)
}

 thoughtsAdapter.notifyDataSetChanged()

标签: androidfirebasefirebase-realtime-databasekotlin

解决方案


data?.get(TIMESTAMP)调用返回一个FirebaseTimestamp对象。因此,不应将其转换为Date,而应将其转换为com.google.firebase.Timestamp

// imports
import com.google.firebase.Timestamp

...

// rest of the code
val timestamp = data?.get(TIMESTAMP) as? Timestamp

如果你想最终得到一个Date对象,你可以使用Timestamp方法toDate()

val date = timestamp?.toDate()

另请注意,您应该使用安全的强制转换运算符as?,而不是as在这种情况下:

val name = data?.get(USERNAME) as? String
val timestamp = data?.get(TIMESTAMP) as? Timestamp
val thoughtTxt = data?.get(THOUGHT_TXT) as? String
val numLikes = data?.get(NUM_LIKES) as? Long
val numComments = data?.get(NUM_COMMENTS) as? Long

data?.get(KEY)可能会产生一个对象,该null对象不能转换为任何类型,并且操作将导致崩溃。


推荐阅读