【问题标题】:Firebase realtime database hiscoreFirebase 实时数据库 hiscore
【发布时间】:2021-06-12 18:50:57
【问题描述】:

我想获取冠军的用户数据(如昵称、国家)。 在我的示例中,我想获取昵称3的数据,因为谁有863 hiScore。这意味着昵称3是冠军。

我尝试了一些东西,但它不起作用。在我看来,首先我应该找到冠军的参考。在找到冠军的参考后,我可以尝试获取冠军孩子的价值观。

你能帮帮我吗?如何获取冠军的价值观。

我尝试的是

override fun getHiScoreInFirebase(interfaceCallback: InterfaceCallback) {

    var ref=FirebaseDatabase.getInstance().reference.child("user").orderByChild("HiScore").limitToLast(1).ref
    ref.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
           if(dataSnapshot.exists()){

            val hiScore=   dataSnapshot.child("HiScore").getValue() as Int
            val kullaniciAdi=   dataSnapshot.child("KullaniciAdi").getValue() as String
            val sehir=  dataSnapshot.child("Sehir").getValue() as String
            val ulke= dataSnapshot.child("Ulke").getValue() as String

            interfaceCallback.hiScoreSonucCallback(hiScore,kullaniciAdi,ulke,sehir)

        }}

        override fun onCancelled(error: DatabaseError) {

        }


    })}

【问题讨论】:

  • 您好,您是否尝试过使用 firebase API 的方法?
  • 是的,我编辑了这个问题。感谢 Zain 的关注。
  • 谢谢你,Puffelen 先生。那我怎样才能找到hiScore最大的冠军的参考。

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

因此,在您的情况下,您需要通过循环 dataSnapshot.children 来处理 dataSnapshot 包含子节点列表的事实。像这样的:

override fun onDataChange(dataSnapshot: DataSnapshot) {
  for (userSnapshot in dataSnapshot.children) {
    val hiScore= userSnapshot.child("HiScore").getValue() as Int
    val kullaniciAdi= userSnapshot.child("KullaniciAdi").getValue() as String
    val sehir= userSnapshot.child("Sehir").getValue() as String
    val ulke= userSnapshot.child("Ulke").getValue() as String

    interfaceCallback.hiScoreSonucCallback(hiScore,kullaniciAdi,ulke,sehir)
  }
}

更新:您还在查询结束时调用.ref,这意味着您将丢弃该查询的所有条件。

这个:

var ref=FirebaseDatabase.getInstance().reference.child("user").orderByChild("HiScore").limitToLast(1).ref

只是一个很长的说法:

var ref=FirebaseDatabase.getInstance().reference.child("user")

要实际保留和使用查询,请执行以下操作:

var query = FirebaseDatabase.getInstance().reference.child("user").orderByChild("HiScore").limitToLast(1)
query.addValueEventListener(object : ValueEventListener {

【讨论】:

  • 谢谢你,Puffelen 先生。那我怎样才能找到hiScore最大的冠军的参考。
  • 你的意思是userSnapshot.getKey()/userSnapshot.getRef()?
  • 我的意思是我想得到冠军的孩子数据。我认为这与 HiScore 的价值有关。我写了“ var ref=FirebaseDatabase.getInstance().reference.child("user").orderByChild("HiScore").limitToLast(1).ref" 但它提供了错误的用户数据。如何找到真正的用户。
  • 最后的.ref 是错误的。我更新了我的答案。
  • 谢谢你,Puffelen 先生。你很棒。再次感谢您。
猜你喜欢
  • 2020-07-05
  • 2021-07-01
  • 1970-01-01
  • 2017-06-03
  • 2016-12-04
  • 2021-10-04
  • 1970-01-01
  • 2017-10-06
  • 2020-07-19
相关资源
最近更新 更多