[英]Is it possible to extract Firebase Authentication data from a program as an API?
[英]Extract Data from firebase
无法从从 firebase 收到的数据快照中提取信息。
目前,我可以从 firebase 获取 dataSnapshot,但我无法从中提取信息。
在下面的示例中,我有一个代码为“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!
}
}
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.