android 从firebase提取数据

epggiuax  于 2022-12-16  发布在  Android
关注(0)|答案(1)|浏览(119)

无法从firebase接收的数据快照中提取信息。
目前,我可以从firebase获取dataSnapshot,但从中提取信息时遇到问题。
在下面的例子中,我有一个代码为“81MUB”的大厅,在大厅里有一个玩家列表(在这个例子中只使用了一个玩家)。Data from FireBase

{
"81MUB": [
    {
      "name": "Alejandro",
      "points": 0
    }
  ]
}

Data Class

data class Player(
    val name: String,
    val points: Int
)

Listener

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)
    }
}

有什么建议吗?

bvhaajcl

bvhaajcl1#

每次调用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!
    }
}

logcat中的结果为:

Alejandro/0

但是,如果要将81MUB节点Map到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()方法,该方法:
创建对自动生成的子位置的引用。子键是在客户端生成的,并包含服务器时间的估计值以用于排序。
而不是用你的密码。

相关问题