我尝试使用Firebase创建排行榜并显示用户名,高分,区域。

时间:2016-10-24 22:49:33

标签: ios swift firebase firebase-realtime-database

我的目标是使用Firebase创建排行榜,并在tableview中显示用户名,高分和区域。我当前的数据库看起来像enter image description here

目前我手头有一切。我是这样做的,所以我可以增加当前用户的数据。不幸的是,通过这样做,我不认为我可以让别人看到别人的高分或用户名。 使用当前节点设置是否有解决此问题的方法,或者我是否需要更改它。如果是这样,有人可以举例说明数据库的外观。

4 个答案:

答案 0 :(得分:4)

您应该将用户特定数据与排行榜分开。

您拥有用户节点,其中您的用户数据位于其唯一用户ID下。 然后,您还可以创建排行榜节点,并在相同的唯一用户ID下创建排行榜特定数据。这样,您不必一次获取所有数据,只知道用户特定数据。

连接是用户ID,即用户将要知道的唯一ID,并通过以下方式检索他/她的数据。其他玩家可以通过查询检索排行榜节点。您还应该存储一些看似冗余的数据,例如用户节点和排行榜都需要的用户名。

不要忘记应用安全规则,因此用户只能写入他/她的数据。

看起来像这样:

enter image description here

知道他/她的UID的经过身份验证的用户可以通过在此路径上获取数据来收听他/她自己的排行榜得分:“排行榜/ UID”正确。

其他玩家应该只需使用路径:“排行榜”来获取排行榜上的每个玩家。要订购它们并且只获取前十名玩家,你必须使用查询。

使用queryOrderedByChild按高分排序您的数据 为此,您还应添加安全规则:“。indexOn”:“highscore”。

获取前十名玩家使用 queryLimitedToFirst将其设置为10,它只会下载前10名玩家。

您应该阅读有关查询的更多信息:https://firebase.google.com/docs/database/ios/lists-of-data#sorting_and_filtering_data

答案 1 :(得分:2)

使用JSON时,树越平坦越好

HighScore :{
  userID1 : 100,
  userID2 : 103;
  userID3 : 210;
   }, 
Users :{
  userID1 :{...}
  userID2 :{...}
  userID3 :{...}     
 }

如果要为用户添加不同的关系属性,只需为该特定用户添加另一个父节点并进行查询。

FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in

        print(Snap.value)

    })

PS: - 您始终可以在firebase中使用安全规则,以便将数据库中特定节点的权限操作给经过身份验证的用户Docs Link

要在firebase节点中附加数据: -

 FIRDatabase.database().reference().child("HighScores").observeSingleEvent(of: .value, with: {(Snap) in

        if let snapDict = Snap.value as? NSMutableDictionary{

            snapDict.setObject(_yourHighScore, forKey : FIRAuth.auth()!.currentUser!.uid as NSCopying)
            FIRDatabase.database().reference().child("HighScores").setValue(snapDict)
        }
    })

答案 2 :(得分:1)

如果需要,您可以将所有内容存储在用户节点下。并通过基于高分应用排序来获取用户详细信息。您还应该应用限制。

如果您打算为用户详细信息和得分创建单独的节点,则必须从得分节点获取得分,并基于用户ID从用户节点获取用户详细信息。

答案 3 :(得分:0)

在@Durian的答案上,代码应如下所示,

let leaderboardDB = Database.database().reference().child("leaderboards")
leaderboardDB.queryOrdered(byChild: "score").queryLimited(toFirst: 100).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in
            if snapshot.exists() {
                print("Retrieving Data!")
                for child in snapshot.children {
                   print("Do whatever you need to do with the data")
                }
            } else {
                print("DB no data!")
            }
        })
    } 

您可以将queryOrder方法调用与queryLimited方法链接在一起,以检索数据。您不必为包装排行榜数据的userId感到困扰,queryOrdered(byChild: "score")方法将查看数据库中每个人的得分并相应地对其进行排序。