从firebase提取数据



无法从从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()方法

创建对自动生成的子位置的引用。子键是在客户端生成的,并且包含对服务器时间的估计,以便进行排序。

而不是使用你的代码。

相关内容

  • 没有找到相关文章

最新更新