繁体   English   中英

从 firebase 中提取数据

[英]Extract Data from firebase

无法从从 firebase 收到的数据快照中提取信息。

目前,我可以从 firebase 获取 dataSnapshot,但我无法从中提取信息。

在下面的示例中,我有一个代码为“81MUB”的大厅,里面有一个玩家列表(示例中只使用了一个玩家)。 数据来自FireBase

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

数据 Class

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

logcat 中的结果将是:

Alejandro/0

但是,如果您想要将81MUB节点 map 转换为Player类型的 object,那么您的数据 class 应如下所示:

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

这将产生与上面完全相同的 output。

您可能还会考虑使用DatabaseReference#push()方法:

创建对自动生成的子位置的引用。 子密钥是在客户端生成的,并包含对服务器时间的估计以用于排序目的。

而不是使用您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM