无法从从firebase接收的数据快照中提取信息。
目前,我能够从firebase获得datassnapshot,但是我有问题从中提取信息。
在下面的例子中,我有一个大厅,代码为"81MUB"在里面我有一个球员列表(在这个例子中只使用一个球员)。来自FireBase的数据
{
"81MUB": [
{
"name": "Alejandro",
"points": 0
}
]
}
数据类data class Player(
val name: String,
val points: Int
)
侦听器
fun getCode(): String {
val index = ('A'..'Z') + ('1'..'9')
var code = ""
for (i in 0..4){
code += index[Random().nextInt(index.size)]
}
return code
}
class MviewModel : ViewModel() {
private val _Players: MutableLiveData<MutableList<Player>> =
MutableLiveData(mutableListOf<Player>(Player("Alejandro", 0)))
private var _LobbyCode: String = ""
private val dataBase = FirebaseDatabase.getInstance()
fun getPlayer(): MutableLiveData<MutableList<Player>> = _Players
fun createLobby() {
_LobbyCode = getCode()
}
fun listener() {
val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
}
override fun onCancelled(databaseError: DatabaseError) {
// Getting Post failed, log a message
}
}
dataBase.reference.child(_LobbyCode).addValueEventListener(postListener)
}
}
提示吗?
每次调用getCode()
时,都生成一个新的随机代码。读取数据时,始终使用数据库中存在的完全相同的代码。在代码中,它应该是这样的:
val db = Firebase.database.reference
val codeRef = db.child("81MUB")
codeRef.get().addOnCompleteListener {
if (it.isSuccessful) {
val snapshot = it.result
val name = snapshot.child("name").getValue(String::class.java)
val points = snapshot.child("points").getValue(Long::class.java)
Log.d("TAG", "$name/$points")
} else {
Log.d("TAG", error.getMessage()) //Never ignore potential errors!
}
}
日志的结果将是:
Alejandro/0
如果您想将81MUB
节点映射为Player
类型的对象,那么您的数据类应该是这样的:
data class Player(
val name: String? = null,
val points: Int? = null
)
在代码中:
val db = Firebase.database.reference
val codeRef = db.child("81MUB")
codeRef.get().addOnCompleteListener {
if (it.isSuccessful) {
val snapshot = it.result
val player = snapshot.getValue(Player::class.java)
Log.d("TAG", "${player.name}/${player.points}")
} else {
Log.d("TAG", error.getMessage()) //Never ignore potential errors!
}
}
将产生与上面完全相同的输出。
你也可以考虑使用DatabaseReference#push()方法
创建对自动生成的子位置的引用。子键是在客户端生成的,并且包含对服务器时间的估计,以便进行排序。
而不是使用你的代码。